我正在研究 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


    – 

  • 2
    这回答了你的问题了吗?


    – 

  • 我查看了链接的文章,您是说尽管 (&A) 位于括号中,但 (&A)[0] 与 &(A[0]) 或 &(A+0) 相同吗?


    – 

  • @Fe2O3:如果i大于0,则B[i - 1]只要i不是大到超过数组上限,则 就是有效的。如果i为零或负数,那么您关于它访问数组越界的说法是正确的。


    – 


  • 1
    @Fe203:我很抱歉造成混乱。我的教授决定将索引设置为 1。我自己更希望索引从 0 开始,因为我也习惯这样。下次,我将决定在发布之前将所有内容重新索引为 0,以使事情变得更简单,其他人无需阅读所有内容即可理解


    – 


1 个回答
1

数组索引运算符[]实际上是指针算术和取消引用的简写。形式的表达式E1[E2]完全等价于*((E1) + (E2)).所以这:

(&A)[0]

与以下完全相同:

*(&A + 0)

可以简化为:

*&A

由于寻址和取消引用有效地相互抵消,因此这与以下内容相同:

A

2

  • 1
    请注意,这种对应关系非常精确,甚至像 5[array] 这样看似无意义的东西也是合法的,并且您会在某些混淆的代码游戏中看到这种构造。


    – 

  • 谢谢你!这就是我一直在寻找的。我的教授用棘手的措辞向我们提出了这些复杂的问题,所以我陷入了困境。感谢您的详尽解释!


    –