这可能是一个愚蠢的问题,但我不明白为什么会这样:

 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个指向整数的指针组成的数组。

10-07 19:16
查看更多