这可能是一个愚蠢的问题,但我不明白为什么会这样:
int** test = new int*[7];
int x = 7;
*(test+1) = &x;
cout << (**(test+1));
测试是一个指向指针的指针对吗?第二个指针指向数组,对吗?
以我的理解,我将需要先取消引用“测试”指针以获取具有该数组的指针。
(*test) // Now I have int*
*((*test) + 1) // to access the first element.
我的错误思想在哪里?
最佳答案
您是否误解了以为您已经创建了一个指向7
int数组的指针?你还没有您实际上已经创建了一个指向int的7
指针数组。因此,这里没有指向数组的“第二个指针”。只有一个指针指向7个指针中的第一个(test
)。
而且,通过*test
,您可以获得尚未初始化的第一个指针。如果您要在其中添加1
,则可以在一些随机地址中添加1
。但是,如果将1
添加到test
,则会得到一个指向数组第二个指针的指针。并推导您获得了您初始化的第二个指针。
您所描述的内容将通过不同的语法实现
typedef int array[7];
array* test = new int[1][7];
// Note: "test" is a pointer to an array of int.
// There are already 7 integers! You cannot make it
// point to an int somehow.
*(*test + 1) = 7;
int *p1 = *test
int i1 = *(p1 + 1); // i1 is 7, second element of the int[7]
delete[] test;
在不使用typedef的情况下,如下所示
int(*test)[7] = new int[1][7];
也就是说,您创建了一个单元素数组,其中的元素类型是int的7元素数组。
new
为您提供了指向该数组的指针。请注意,括号很重要:*
的优先级比[7]
的优先级低,因此,否则它将被视为一个由7个指向整数的指针组成的数组。