C语言中指针变量为何可使用p[i]下标访问形式?
关于C语言指针下标访问的疑问
以下是示例代码:
#include <stdio.h> int main(void){ int a[3][3], *p, i; p = &a[0][0]; for(i=0; i<9; i++) p[i]=i+1; printf("%d\n", a[1][2]); return 0; }
我知道这段代码会输出6,但由于p是指针变量,为何可以写成p[i]的形式?我猜测p[i]等价于*(p+i),指向二维数组的第i个元素,但我的疑问是:若p仅为指针变量,为何p[i]与*(p+i)等价?
补充:我知道定义数组a[10]时,a可视为指针常量。
补充说明:我的困惑点在于指针为何可以使用下标访问,想知道这种写法在C语言中为何被允许?
这是C语言标准直接规定的语法规则——下标运算符[]本质就是指针加法和解引用的语法糖,不管操作数是数组名还是指针变量,E1[E2]都会被编译器解析为*(E1 + E2)。
具体来说:
- 写
p[i]时,编译器会自动转换成*(p + i):先计算指针p向后偏移i个元素的地址(因为p是int*类型,实际偏移字节数是i * sizeof(int)),再对这个地址解引用,拿到对应位置的元素。 - 数组名能用上标,本质是因为数组名在表达式中会隐式转换成指向数组首元素的指针(少数例外情况比如用
sizeof取数组大小时除外),所以数组的a[i]同样会被解析成*(a + i)。
C语言允许指针用下标访问,核心目的是让数组和指针的操作语法保持一致,降低代码编写和学习的成本——不管你是直接操作数组,还是通过指针间接操作连续内存块,都能用熟悉的下标写法,不用切换不同的逻辑。
就像你例子里的p指向了二维数组的首元素,而二维数组在内存中是连续存储的,所以p[i]能依次访问到数组里的每一个元素,和直接操作数组的效果完全一致。
内容的提问来源于stack exchange,提问作者mendax1234
相关产品推荐
相关产品推荐

