【问题标题】:A pointer to 2d array指向二维数组的指针
【发布时间】:2012-01-26 21:31:24
【问题描述】:

我有一个关于指向二维数组的指针的问题。如果一个数组类似于

int a[2][3];

那么,这是指向数组a的指针吗?

int (*p)[3] = a;

如果这是正确的,我想知道[3]int(*p)[3] 的含义是什么?

【问题讨论】:

    标签: c++ arrays pointers multidimensional-array


    【解决方案1】:

    另请注意:

    int *p[5]        // p is an array of 5 pointers
    
    int (*p)[5]      // p points to an array of 5 ints
    
    int (*(p+5))[10] // p is a pointer to a structure where the structure's 5th element has 10 ints .
    

    【讨论】:

    • OP 提出了一个概念性问题,我已经在这里回答了。代替 5 放 3!。此外,我还添加了有关如何使用指针从二维数组中获取值的更多详细信息。
    • 我认为这比此处提供的其他答案更令人困惑。
    【解决方案2】:

    你可以像一维数组一样指向二维数组

    #include <iostream>
    int main()
    {
       int array[2][2] = {{0,1}, {2,3}}; // array
       int *ptr;
       ptr=(int*)array;
       std::cout << *(ptr)   << '\n';//out 0
       std::cout << *(ptr+1) << '\n';//out 1 
       std::cout << *(ptr+2) << '\n';//out 2
       std::cout << *(ptr+3) << '\n';//out 3
    }
    

    【讨论】:

      【解决方案3】:

      您不应将int[2][3] 称为“二维数组”,而应将其视为“数组数组”。它是一个包含两个项目的数组,其中每个项目本身就是一个包含 3 个整数的数组。

      int (*p)[3] = a;
      

      您可以使用p 指向a 中的两个项目之一。 p 指向一个三整数数组——即第一个这样的项目。 p+1 将指向第二个三整数数组。要初始化 p 以指向第二个元素,请使用:

      int (*p)[3] = &(a[1]);
      

      以下是指向这两项中的第一项的等效方法。

      int (*p)[3] = a; // as before
      int (*p)[3] = &(a[0]);
      

      【讨论】:

      • 你甚至可以写 [3]a 例如 :) 这是了解 C 中真正的数组的好方法。
      • 这个声明需要多少内存:int (*p)[65];??这是一个指针,还是 65 个指针?
      【解决方案4】:

      严格来说,不,int (*p)[3] = a; 不是指向a 的指针。它是指向a 的第一个元素的指针。 a 的第一个元素是一个由三个整数组成的数组。 p 是一个指向三个整数数组的指针。

      一个指向数组a的指针会这样声明:

      int (*q)[2][3] = &a; 
      

      pq 的数值可能(甚至可能要求)相同,但它们属于不同类型。当您对pq 执行算术运算时,这将发挥作用。 p+1 指向数组a 的第二个元素,而q+1 指向刚好超出数组a 末尾的内存。

      记住:cdecl 是你的朋友:int a[2][3]int (*q)[2][3]

      【讨论】:

        【解决方案5】:
        int a[2][3];
        

        a 被读取为 int 数组 3 的数组 2,它只是一个数组数组。写的时候,

        int (*p)[3] = a;

        它将p 声明为指向数组的第一个元素的指针。所以,p 指向 3 个整数的数组,它是数组数组中的一个元素。

        考虑这个例子:

                int a[2][3]
        +----+----+----+----+----+----+
        |    |    |    |    |    |    |
        +----+----+----+----+----+----+
        \_____________/
               |
               |    
               |
               p    int (*p)[3]
        

        这里,p 是指向 3 个整数数组的指针,它是数组数组的一个元素。

        【讨论】:

        • 不会“p”变成一个由3个整数指针组成的数组,第一个值指向“a”的第一个值吗?
        【解决方案6】:

        [3] 是类型的一部分。在这种情况下,p 是一个指向大小为 3 的数组的指针,该数组包含整数。

        数组的特定类型总是包括它的大小,所以你有 int *[3]int *[5] 类型,但不只是 int *[] 有未定义的大小。

        int *x[20]; /* type of x is int *[20], not just int *[] */
        int y[10][10]; /* type of y is int[10][10], not just int[][] */
        

        【讨论】:

        • 感谢您的评论。当您说大小时,是否意味着 (*p) 具有 [0],[1]],[2] ?如果是这种情况,[2] 的房间在哪里?还是指向[0][0]和[0][1]?
        • p 只是一个指向 3 个整数数组的指针。它不知道a 的第一个维度是2,因为它被分配给a 的第一个元素,这正是int[3] 的类型。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多