C语言中,在函数体中或在函数外部定义的数组名可以认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址,也就是数组所占一串连续存储单元的起始地址,定义数组时的类型即是此指针变量的基类型。重要的是:这个指针变量中的地址值不可改变,也就是说,不可以给数组名重新赋值!因此,也可以认为数组名是一个地址常量。
若在函数体中有以下定义:
float a[ l0 ],*P,X;
语句a=&x;或a++;都是非法的,因为不能给a重新赋地址值。一旦定义,a永远指向a数组的首地址。
虽然不可以改变数组名a中的内容,但可以用对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。例如(假设已定义k为int类型):
for(k=0;k<10;k++)P=a+k;
www.examzz.com在循环中并没有改变a的值,但通过表达式:a+k,逐一给出了a数组中每个元素的地址,使P依次指向a数组中的每一个元素。
由于scanf函数要求给出输入项的地址值,因此可以通过以下循环从终端读人数据依次放人a数组中:
for(k=0;k<10;k++)seanf(”%d”,a+k);
语句P=&a[0];和P=a;都是合法的。这两条语句的功能相同,都是使指针变量P指
向a数组的首地址。
由以上叙述可知:a是a数组元素的首地址,a(即:a+0)的值即等于&a[0],则a+1的值等于&a[1]、a+2的值等于&a[2]、……、a+9的值等于&a[9]。
在第8章我们曾经讨论过:可以通过“间接访问运算符”——“*”来引用地址所在的存储单元,因此对于数组元素a[0],可以用表达式*&a[0]来引用,也可以用*(a+0)来引用,对此也可写成:。a;而对于数组元素a[1],可以用表达式*&a[1]来引用,也可以用*(a+1)来引用,因为a+1即是a[1]的地址,使用“间接访问运算符”可以引用地址所代表的存储单元,因此,*(a+1)就是a[1];……;对于数组元素a[9],可以用表达式术&a[9]来引用,也可以用*(a+9)来引用。因此可以通过以下语句逐个输出a数组元素中的值:
for(k=0;k<10;k++)printf(”%4d”,*(a+k));
此语句相当于:
for(k=0;k<10;k++)prinff(”%4d”,a[k]);