C 语言指针与数组的深度关联及实战应用
在 C 语言开发中,指针和数组的纠缠关系往往是新手最容易踩坑的地方。这篇文章不讲枯燥的定义,直接聊聊数组名的本质、指针算术运算的实际用法,以及指针数组和数组指针的区别。搞懂这些,你在处理内存、遍历数据时会更从容。
数组名与指针的关系
很多初学者容易把数组名当成普通的变量,其实它在大多数情况下会被编译器隐式转换为指向首元素的常量指针。这意味着你可以用指针的方式去访问它,但它本身不能变。
数组名的本质
看这段代码:
#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 和 &arr[0] 的地址完全一致,都是数组第一个元素的地址。通过 *arr 解引用也能拿到第一个元素的值。这验证了数组名确实能当指针用。
⚠️ 注意:数组名是常量指针,你不能修改它的值。下面这种写法是非法的:
int arr[5];
arr++; // 错误!数组名是常量,不能自增
下标访问与指针等价性
C 语言规定,arr[i] 在底层完全等价于 *(arr + i)。这是指针操作数组的核心逻辑。指针算术运算会根据元素类型自动计算偏移量,比如 int 占 4 字节,arr + 1 就会跳过 4 个字节指向下一个元素。
#include
{
arr[] = {, , , , };
i;
(i = ; i < ; i++) {
(, i, arr[i], i, *(arr + i));
}
;
}


