【问题标题】:2D Array decaying to pointer in C二维数组衰减为 C 中的指针
【发布时间】:2018-09-06 14:24:34
【问题描述】:

这是此论坛中“一些程序员老兄”的回答的扩展问题。 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】:

让我们看看您的二维数组,并考虑您所询问的各种变量的类型:

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

现在:

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

你的问题是:

输入 s[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)。

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2013-07-19
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多