C 语言指针与数组的深层关系及实战
在 C 语言开发中,指针与数组的关系是理解内存模型的关键。很多初学者容易混淆这两个概念,其实它们既紧密关联又有本质区别。掌握数组名的本质、指针算术运算以及指针数组与数组指针的区别,能帮助你更高效地处理数组遍历、数据交换等实际任务。
数组名的本质
数组名在大多数情况下会被编译器隐式转换为指向数组首元素的常量指针。这意味着 arr 和 &arr[0] 在数值上是相等的,都代表数组第一个元素的地址。
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
printf("数组首元素地址:%p\n", arr);
printf("数组首元素地址:%p\n", &arr[0]);
printf("数组首元素值:%d\n", *arr);
return 0;
}
运行结果会显示两个地址一致,且通过 *arr 可以访问到首元素值 10。这验证了数组名可当作指针使用。
注意:数组名是常量指针,不能修改其指向。以下代码会导致编译错误:
int arr[5];
arr++; // 错误,数组名是常量,不能进行自增操作
下标与指针的等价性
C 语言规定,数组下标访问 arr[i] 完全等价于指针访问 *(arr + i)。这是指针操作数组的核心逻辑。指针算术运算会根据元素类型自动计算偏移量,例如 int 类型占 4 字节,arr + 1 就会向后移动 4 字节。
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, };
i;
(i = ; i < ; i++) {
(, i, arr[i], i, *(arr + i));
}
;
}


