C 语言指针与数组的深层关联及实战应用
在 C 语言开发中,指针与数组的关系是理解内存模型的关键。很多初学者容易混淆这两个概念,其实它们既紧密相连又有本质区别。本文旨在通过实战案例,帮你彻底理清数组名的本质、指针算术运算以及指针数组与数组指针的区别。
1. 数组名与指针的关系
1.1 数组名的本质
数组名在大多数情况下会被编译器隐式转换为指向数组首元素的常量指针。我们来看一段简单的代码:
#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;
}
运行结果如下:
数组首元素地址:0x7ffeefbff560
数组首元素地址:0x7ffeefbff560
数组首元素值:10
从结果可以看出,arr 和 &arr[0] 表示的是同一个地址,都是数组首元素的地址。使用 *arr 可以直接访问数组的首元素,这就验证了数组名可以被当作指针使用。
⚠️ 注意:数组名是常量指针,不能被修改。以下代码是错误的:
int arr[5];
arr++; // 错误,数组名是常量,不能进行自增操作
1.2 数组下标与指针的等价关系
C 语言规定,数组下标访问 arr[i] 等价于指针访问 *(arr + i)。这个等价关系是指针操作数组的核心,我们可以通过指针算术运算来访问数组的任意元素。
示例代码:
#include
{
arr[] = {, , , , };
i;
(i = ; i < ; i++) {
(, i, arr[i], i, *(arr + i));
}
;
}


