You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]上:

  1. (&A)[0]展开为*(&A + 0),加0不改变指针地址,所以等价于*&A。
  2. *和&是互逆操作,但这里要注意类型:&A是指向整个数组的指针,解引用它(*&A)得到的是数组本身A。
  3. 当把这个数组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:12:29