【问题标题】:Pointer to an entire row in a 2-D array指向二维数组中整行的指针
【发布时间】:2014-07-04 17:12:31
【问题描述】:

假设我将一个二维数组声明为:

int a[10][10];

据我了解,a 是 int 类型的双指针。

假设我声明一个指向整行的指针,如下所示。

int (*p)[10];

还有a[0] 指向第0 行,a[1] 指向第1 行……等等。

所以我尝试将 p 初始化为

p = a[0];  /* so that p can point to row 0 */

我收到不兼容指针分配的编译器警告。 但是如果我写

p = a;

这很好用。

谁能告诉我我在这里做错了什么?

【问题讨论】:

  • “根据我的理解,a 是 int 类型的双指针”——不,它是一个数组数组。它不是一个指针。它不是“双指针”。它不是指针对指针。这是一个 array (数组)。因此,p[0]p[1]p[i](对于所有 0 也不是指针。它们也是数组。它们衰减为int * 类型的指针。 int * 类型与 int (*p)[10] 类型不兼容。但是,您是正确的,指向数组第 i 行的 指针 的类型是 int (*)[10]。所以你可以这样写:int (*row)[10] = &a[0];.
  • “根据我的理解,a 是 int 类型的双指针” 最普遍且持续存在的误解之一。了解数组和指针之间的区别至关重要,不要被交换符号的语法能力所迷惑。
  • 不是重复的...我不关心这里的语法。

标签: c arrays pointers


【解决方案1】:

根据我的理解,a 是 int 类型的双指针。

你错了。 aint 的数组类型。数组名称转换为指向其第一个元素的指针,除非它是 sizeof 和一元 & 的操作数。

还有a[0]指向行0a[1]指向行1..等等。

没有。 a[0] 指向0 行的第一个元素,a[1] 指向1 行衰减后的第一个元素。 &a[0] 会给你行的地址0

p = &a[0];  // Equivalent to p = a 

【讨论】:

    【解决方案2】:

    a 不是双指针。这是一个由十个数组组成的数组,每个数组有十个整数。在大多数用途中,它会“衰减”为int (*)[10] 类型的指针,即指向第一行的指针。

    所以在p = a 赋值中,a 如上所述衰减,所以p 指向第一行。

    如果你想指向另一行,你需要明确地获取它的地址:

    p = &a[5]
    

    【讨论】:

      【解决方案3】:

      a 是 int 类型的双指针。

      没有。 a 是一个 int 数组的数组。

      a[0] 也指向第 0 行

      没有。 a[0] 第一行,一个int数组。为了指向到第一行,你需要&a[0]

      大多数时候,您可以将 &a[0] 写成 a,因为在大多数(但不是所有)上下文中,数组表达式会隐式转换为指向其第一个元素的指针。

      【讨论】:

      • 另一种看待&a[0] 的方式是,它实际上与&(*(a+0)) 相同,与&*a 相同,并且(因为相邻的&* 运算符被隐式减少)相同的@ 987654330@.
      【解决方案4】:

      您总是可以通过使用其名称来分配指向数组、字符串或函数的指针。即,如果 a[10] 是一个包含 10 个整数元素的数组,您可以使用表达式 p = a 分配指针 p,现在是 'a' 将给出数组的基地址。因此 'p' 现在指向一个包含 10 个元素的数组。

      同样的概念可以应用于字符串和函数..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 2012-01-26
        • 1970-01-01
        相关资源
        最近更新 更多