我遇到了这个问题:
在下面的声明中,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指针?如果有人能向我解释,我将不胜感激
答案 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)
实现之间的区别
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
int* p[5]
;我很好奇为什么他们这样做int *(*p)[5]
; 它不是“正常”,因为int* p[5]
不是指向5 int数组的指针,它是一个由5个指向int的数组。
目前尚不清楚。从一开始就没有办法“制作一个由5个指针组成的3个数组的数组”。