C语言中(&A)[0]的逻辑疑问:数组指针迭代相关问题
关于
(&A)[0]的C语言指针逻辑解析 先明确几个关键的类型与概念:
- 对于数组
int A[N];,数组名A在多数场景下会隐式转换为指向数组首元素的指针,类型是int*,等价于&A[0]。 &A是指向整个数组的指针,类型为int (*)[N](可理解为“指向包含N个int的数组的指针”)。它的数值和A、&A[0]完全一致(都是数组起始地址,比如你提到的0x8000),但两者的类型差异极大——这也是理解(&A)[0]的核心。
(&A)[0]的工作逻辑
C语言里,下标运算符[]的本质是指针加法+解引用,即x[y]等价于*(x + y)。套用到(&A)[0]上:
(&A)[0]展开为*(&A + 0),加0不改变指针地址,所以等价于*&A。*和&是互逆操作,但这里要注意类型:&A是指向整个数组的指针,解引用它(*&A)得到的是数组本身A。- 当把这个数组
A赋值给int* B时,数组名再次触发隐式转换,变成指向首元素的int*指针——和直接写int* B = A;的效果完全一致。
直观例子验证
假设int A[3] = {10, 20, 30};,数组起始地址是0x8000:
&A是类型为int (*)[3]的指针,值为0x8000。(&A)[0] = *(&A + 0),解引用后得到数组A,赋值给int* B时,A隐式转为int*类型的指针,指向A[0](地址0x8000)。- 所以
B[i-1]和直接用A赋值时的访问逻辑完全相同,自然能正常输出数组元素。
额外补充:如果写成(&A)[1],那就是*(&A + 1)——此时指针会跳过整个数组的大小(3个int共12字节),指向0x800C的位置,这和A+1(跳过单个int,指向0x8004)的行为完全不同,这也能体现&A(数组指针)和A(元素指针)的类型差异。
内容的提问来源于stack exchange,提问作者Amy Gregg
相关产品推荐
相关产品推荐

