我正在研究 C 语言中的一些指针语句,了解如何迭代从A[]
开始的数组 () i = 1
。我能够理解为什么以下内容有效:
int* B = A; printf("%d\n", B[i - 1]);
但当我看到这个也有效时,我感到困惑。
int* B = (&A)[0]; printf("%d\n", B[i - 1]);
有人可以解释一下背后的逻辑(&A)[0]
吗?
我想(&A)
获取 的地址A
,比方说0x8000
,但我不确定[0]
会对地址做什么。
8
1 个回答
1
数组索引运算符[]
实际上是指针算术和取消引用的简写。形式的表达式E1[E2]
完全等价于*((E1) + (E2))
.所以这:
(&A)[0]
与以下完全相同:
*(&A + 0)
可以简化为:
*&A
由于寻址和取消引用有效地相互抵消,因此这与以下内容相同:
A
2
-
1请注意,这种对应关系非常精确,甚至像 5[array] 这样看似无意义的东西也是合法的,并且您会在某些混淆的代码游戏中看到这种构造。
– -
谢谢你!这就是我一直在寻找的。我的教授用棘手的措辞向我们提出了这些复杂的问题,所以我陷入了困境。感谢您的详尽解释!
–
|
–
–
–
i
大于0
,则B[i - 1]
只要i
不是大到超过数组上限,则 就是有效的。如果i
为零或负数,那么您关于它访问数组越界的说法是正确的。–
–
|