int指针数组

时间:2014-09-24 23:21:48

标签: c++ arrays pointers

我遇到了这个问题:

  

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

     

int *(* p)[5];

     

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

     

一个。 p = new int [3] [5] *;

     

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

     

℃。 p = new int [3] * [5];

     

d。 p = new int * [3] [5];

     

电子。 p = new int(* [3])[5];

答案是什么?

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

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

5 个答案:

答案 0 :(得分:1)

F:

using IPA5 = int*[5];

IPA5 * p = new IPA5[3];

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

p[0][i] i [0, 5) int * {{1}} {{1}},您可以以任何您喜欢的方式使用{包括使其指向第一个元素anohter动态阵列。)

答案 1 :(得分:1)

你会写什么:

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”是正确的。

答案 2 :(得分:0)

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的类型)

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

  • 答案是什么?

d

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

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

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

目前尚不清楚。从一开始就没有办法“制作一个由5个指针组成的3个数组的数组”。