归纳起来,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下4种:
1) 形参和实参都是数组名。
main() {int a[10]; …… f(a,10) …… f(int x[],int n) { …… } }
a和x指的是同一组数组。
2) 实用数组,形参用指针变量。
main() {int a[10]; …… f(a,10) …… f(int *x,int n) { …… } }
3) 实参、型参都用指针变量。
4) 实参为指针变量,型参为数组名。
void inv(int *x,int n) {int *p,m,temp,*i,*j; m=(n-1)/2; i=x;j=x+n-1;p=x+m; for(;i<=p;i++,j--) {temp=*i;*i=*j;*j=temp;} return; } main() {int i,arr[10]={3,7,9,11,0,6,7,5,4,2},*p; p=arr; printf("The original array:\n"); for(i=0;i<10;i++,p++) printf("%d,",*p); printf("\n"); p=arr; inv(p,10); printf("The array has benn inverted:\n"); for(p=arr;p< arr+10;p++) printf("%d,",*p); printf("\n"); }
注意:main函数中的指针变量p是有确定值的。即如果用指针变作实参,必须现使指针变量有确定值,指向一个已定义的数组。
main() {int *p,i,a[10]={3,7,9,11,0,6,7,5,4,2}; printf("The original array:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n"); p=a; sort(p,10); for(p=a,i=0;i<10;i++) {printf("%d ",*p);p++;} printf("\n"); } sort(int x[],int n) {int i,j,k,t; for(i=0;i< n-1;i++) {k=i; for(j=i+1;j< n;j++) if(x[j]>x[k])k=j; if(k!=i) {t=x[i];x[i]=x[k];x[k]=t;} } }
说明:函数sort用数组名作为形参,也可改为用指针变量,这时函数的首部可以改为:
sort(int *x,int n) 其他可一律不改。