ITEEDU

归纳起来,如果有一个实参数组,想在函数中改变此数组的元素的值,实参与形参的对应关系有以下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) 实参为指针变量,型参为数组名。

【例10.20】用实参指针变量改写将n个整数按相反顺序存放。
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是有确定值的。即如果用指针变作实参,必须现使指针变量有确定值,指向一个已定义的数组。

【例10.21】用选择法对10个整数排序。
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) 其他可一律不改。