2D数组衰减到C中的指针

时间:2018-09-06 14:24:35

标签: arrays pointers 2d

这是该论坛中“ Some Programme dude”回答的扩展问题。 Accessing 2D array elements using pointer arithmetic in C

要引用答案,

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

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

我认为3等于2,而4等于5。

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

1 个答案:

答案 0 :(得分:0)

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

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

现在:

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

您的问题状态:

  

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

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

由于s[0]是一个 array ,因此它等效于其第一个元素的地址。数组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)。

正如“一些程序员花花公子”在他对原始问题的回答中的图表中所示,这些各种指针可能指向内存中的同一位置,但从语义上讲它们是完全不同的。

希望这会有所帮助!