p=a;
for(i=0;i<10;i++)
*p++=i;
p=a;
for(i=0;i<10;i++)
printf("a[%d]=%d\n",i,*p++);
}
谭浩强 C 语言程序设计 2001 年 5 月 1 日
3) 从上例可以看出,虽然定义数组时指定它包含 10 个元素,但指针变量可以指到数组以
后的内存单元,系统并不认为非法。
4) *p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。
5) *(p++)与*(++p)作用不同。若 p 的初值为 a,则*(p++)等价 a[0],*(++p)等价 a[1]。
6) (*p)++表示 p 所指向的元素值加 1。
7) 如果 p 当前指向 a 数组中的第 i 个元素,则
*(p--)相当于 a[i--];
*(++p)相当于 a[++i];
*(--p)相当于 a[--i]。
10.3.3 数组名作函数参数
数组名可以作函数的实参和形参。如:
main()
{int array[10];
……
……
f(array,10);
……
……
}
f(int arr[],int n);
{
……
……
}
array 为实参数组名,arr 为形参数组名。在学习指针变量之后就更容易理解这个问题
了。数组名就是数组的首地址,实参向形参传送数组名实际上就是传送数组的地址,形参得
到该地址后也指向同一数组。这就好象同一件物品有两个彼此不同的名称一样。
谭浩强 C 语言程序设计 2001 年 5 月 1 日
同样,指针变量的值也是地址,数组指针变量的值即为数组的首地址,当然也可作为函
数的参数使用。
【例 10.15】
float aver(float *pa);
main(){
float sco[5],av,*sp;
int i;
sp=sco;
printf("\ninput 5 scores:\n");
for(i=0;i<5;i++) scanf("%f",&sco[i]);
av=aver(sp);
printf("average score is %5.2f",av);
}
float aver(float *pa)
{
int i;
float av,s=0;
for(i=0;i<5;i++) s=s+*pa++;
av=s/5;
return av;
}
【例 10.16】将数组 a 中的 n 个整数按相反顺序存放。
算法为:将 a[0]与 a[n-1]对换,再 a[1]与 a[n-2] 对换