2D阵列衰减到C中的指针

问题描述 投票:0回答:1

这是一个来自本论坛“一些程序员家伙”答案的延伸问题。 Accessing 2D array elements using pointer arithmetic in C

引用回答者,

  1. &S [0] [0]。这是int *类型。
  2. &S [0]。这是int(*)[2]类型。
  3. S [0]。这将衰减为指向s [0]中第一个元素的指针,并且等于1。
  4. 秒。这将衰减为指向s中第一个元素的指针,并且等于2。
  5. &S。指向数组的指针,类型为int(*)[4] [2]。

我不明白为什么3等于1和4等于2?

我认为3等于2和4等于5。

例如,输入s [0]将给出s [0]的地址,因为它是一个数组,因此s [0] =&s [0]。

arrays pointers 2d
1个回答
0
投票

我们来看看您的2D数组,并考虑您询问的各种变量的类型:

int s[4][2] = {
    {1234,56},
    {1212,13},
    {1434,80},
    {1312,78}
  };

现在:

  • s是一个二维数组的整数。
  • s[0]s[1]等是int的数组。

你的问题陈述:

put [0]将给出s [0]的地址,因为它是一个数组,因此s [0] =&s [0]

这是不正确的。在表达式中使用时,数组的名称会衰减为指向数组第一个元素的指针。 s的第一个元素是什么?它是整个阵列s[0]

由于s[0]是一个数组,因此它等同于第一个元素的地址。数组s[0]的第一个元素是什么?这是int s[0][0]。因此,当在表达式中使用时,数组名称s[0]的值等于数组的第一个元素的地址,即s[0][0],我们有:

s[0] == &s[0][0]

这就是为什么(3)在你引用的答案中等同于(1)。

同样,s相当于&s[0]。当在表达式中使用时,数组名称s衰减为指向整个数组s[0]的指针;作为指向两个int元素数组的指针,它的类型是int (*) [2]。它的值是&s[0]的地址,即整个数组的地址(不仅仅是它的第一个元素)。这就是为什么(4)等同于(2)。

正如“一些程序员家伙”在图中对原始问题的回答所示,这些不同的指针可能指向内存中的相同位置,但在语义上它们是完全不同的。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.