【问题标题】:Array of int pointersint 指针数组
【发布时间】:2014-09-24 23:21:47
【问题描述】:

我遇到了这个问题:

在下面的声明中,p 是一个指向 5 个 int 数组的指针 指针。

int *(*p)[5];

以下哪个语句可以用来分配内存 为了使 p 成为 3 个 5 个数组的数组的第一个维度 指向 int 类型的指针?

A. p = 新整数 [3][5]*;

B. p = new int (*)[3][5];

C. p = 新整数 [3]*[5];

D. p = 新整数 *[3][5];

E. p = new int (* [3] ) [5];

答案是什么?

我不确定我是否理解这个问题。通常我会创建一个指向 5 int 数组的指针,例如 int* p[5]; 我很好奇他们为什么这样做 int *(*p)[5];

这个问题还想要什么?是否要求对前 3 个 int 指针进行初始化(分配内存)?如果有人可以向我解释这一点,我将不胜感激

【问题讨论】:

  • F. std::array<std::array<int, 5>, 3>
  • G. auto p = std::array<std::array<int*, 5>, 3>{{}};

标签: c++ arrays pointers


【解决方案1】:

F:

using IPA5 = int*[5];

IPA5 * p = new IPA5[3];

每个元素 p[0]p[1]p[2] 只是一个普通的、类型化的 int* 数组。除了初始动态分配之外,没有任何动态发生,其中3 被允许为动态量。

然后p[0][i] for i in [0, 5) 是一个int *,你可以以任何你喜欢的方式使用它(包括使它指向另一个动态数组的第一个元素)。

【讨论】:

    【解决方案2】:

    你会写成什么:

    int* p[5];
    

    是一个由指向int 的指针组成的五元素数组。

    这声明了什么:

    int *(*p)[5];
    

    是一个指向int的五元素数组的指针,即指向你刚刚写的东西类型的指针。

    换句话说;你可以这样做:

    int * a[5];
    int * (*p)[5] = &a;
    

    您可以按以下方式逐步阅读此内容:

    (*p)               //  p is a pointer
    (*p)[5]            //  p is a pointer to an array of size 5
    int * (*p)[5]      //  p is a pointer to an array of size 5 of type pointer to int
    

    *p 周围需要括号,否则:

    int ** p[5];
    

    将声明一个int ** 类型的5 元素数组,或指向int 的指针,这完全是另一回事。

    问题基本上是要求您动态分配相当于上面a 的三个内存,所以答案“D”是正确的。

    【讨论】:

      【解决方案3】:

      答案是
      D. p = new int *[3][5];
      其他的都是语法错误

      实现之间的区别
      整数 * p [5];
      int * (*p) [5];

      考虑这个例子
      整数 *(*p)[5];
      int pp[5];
      pp[0][0] = 新整数 [5]; //LHS是int,RHS是int
      ,编译错误
      p[0][0] = 新整数 [5]; //这是有效的,因为 p[0][0] 是指针而不是 int

      尝试将每个维度都视为为您添加额外的 *
      回到问题
      int *(*p)[5] 给你 3 * (***p)
      所以你可以分配
      p = int *[3][5]
      因为它也有 3 *

      【讨论】:

        【解决方案4】:

        int* p[5] 的类型为 array of size 5 of int*。它衰减到int**,因此p + 1 将指向该数组的第二个元素。

        int *(*p)[5] 的类型为 pointer to array of size 5 of int*。您可以将其视为衰减的二维数组int* [][5]。所以p + 1 将指向该数组第一个维度的第二个元素,即指向 int 的 5 个指针之后的下一个字节。

        这使我们得出正确答案是D的结论。

        (更不用说无论p的类型如何,其他答案都无法编译)

        【讨论】:

          【解决方案5】:
          • 答案是什么?

          D

          • 通常我会创建一个指向 5 个 int 数组的指针,例如 int* p[5];我很好奇他们为什么以int *(*p)[5] 这样做;

          这不是“正常”,因为int* p[5] 不是指向 5 个 int 数组的指针,而是一个由 5 个指向 int 的指针组成的数组。

          • 这个问题还想要什么?是否要求对前 3 个 int 指针进行初始化(分配内存)?

          不清楚。首先,没有办法“使 p 成为由 3 个数组组成的数组,其中包含 5 个指向 int 类型的指针”。

          【讨论】:

            猜你喜欢
            • 2021-02-07
            • 1970-01-01
            • 2014-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多