6.4.1 数组名亦是指针
C 语言中,数组名所对应的值就是第一个数组元素的内存地址,即可以把数组名看为指向数组首元素的指针。我们能够对该指针进行解引用,从而对数组首元素进行访问。例如:
int a[5] = {10, 20, 30, 40, 50}; printf("The first element value: %d\n", *a);
以上语句首先定义了一个长度为 5 的 int 类型数组 a,并对数组进行了初始化。由于可以将数组名 a 看为指向第一个数组元素的指针,因此,在第二条语句中,通过对数组名 a 进行解引用,便可访问到第一个数组元素,同时通过 printf 打印输出到控制台窗口上,如图 6.11 所示。
图 6.11 通过指针访问数组首元素
编译运行程序,结果如下:
The first element value: 10
我们也可以通过该指针来修改首元素的值,例如:
int a[5] = {10, 20, 30, 40, 50}; *a = 100; printf("The first element value: %d\n", *a);
在第二条语句中,由于数组名是指向数组首元素的指针,因而对其进行解引用访问到数组第一个元素,并将其重新赋值为 100。
再次编译运行程序,结果如下:
The first element value: 100
从中可以看出,通过对数组名进行解引用,就可以对数组首元素进行访问和修改,与使用数组下标来访问和修改数组元素的效果相同。因此,认为“*a”等价于“a[0]”,“*a =100”等价于“a[0] = 100”。
其实,也可以通过取地址符来获得数组首元素的内存地址,并将其存储到一个指针变量中,例如:
int a[5] = {10, 20, 30, 40, 50}; int *pi = &a[0]; printf("The first element value: %d\n", *pi);
在第二条语句中,定义了 int 类型的指针变量 pi,并通过取地址符获取数组首元素的内存地址,作为指针变量 pi 的初始值。第三条语句中,通过对指针 pi 进行解引用,访问数组首元素,并通过 printf 打印其值。
由于数组名即是数组首元素的内存地址,因此,可以将第二条语句修改为:
int *pi = a; //等价于 int *pi = &a[0];
既然指针变量 pi 保存了数组首元素的内存地址,数组名也表示为数组首元素的地址。那么,数组名 a 是否等同于指针变量 pi 呢?
答案是否定的,即数组名不同于指针变量。原因是指针变量的值可以改变,即存储不同的内存地址值;而数组名永远只能表示数组首元素的内存地址,不能被改变。例如:
pi = &a[1]; //将数组第二个元素的内存地址赋值给指针变量 pi a = &a[1]; //错误,数组名只能表示为首元素的内存地址,不允许被改变
第一条语句中,将数组中第二个元素的内存地址赋值给指针变量 pi,即相当于将指针 pi 由原来指向数组首元素,修改为指向数组中的第二个元素。第二条语句中,尝试让数组名表示为数组第二个元素的内存地址,这是不允许的。因此,数组名更像是一个指针常量,我们可以通过它来访问或修改它所指向的对象,但它自身的值不允许被修改,即永远只能指向数组中的第一个元素。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论