C++ 指针到指针数组的理解问题

C++ 指针到指针数组的理解问题,c++,pointers,C++,Pointers,这可能是个愚蠢的问题,但我不明白为什么会这样: int** test = new int*[7]; int x = 7; *(test+1) = &x; cout << (**(test+1)); 我的错误思维在哪里?表达式*(test+1)相当于test[1],因此您的代码可以重写如下: int** test = new int*[7]; int x = 7; test[1] = &x; cout << *test[1]; int**

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

 int** test = new int*[7];

 int x = 7;
 *(test+1) = &x;

 cout << (**(test+1));
我的错误思维在哪里?

表达式
*(test+1)
相当于
test[1]
,因此您的代码可以重写如下:

int** test = new int*[7];

int x = 7;
test[1] = &x;

cout << *test[1];
int**test=newint*[7];
int x=7;
测试[1]=&x;
难道不能假定

test[0] = 0x12345678;   // some pointer value
test[1] = 0x23456789;   // some pointer value
*测试=0x12345678

*test+1现在是0x12345678+1=0x12345679

*或取消引用运算符的优先级高于二进制+
。所以表达式是按这个顺序计算的

然而,您想要的是测试[0]=0x23456789

因此,正确的表达式可以到达
test[1]=(*(test+1))

一般来说,
arr[i]
*(arr+i)

编辑2:

给定

int buf[10] = {0, 1, 2};
int *p = buf;
buf[0]==p[0]=*(p+0)等于0


请注意,将数组访问语法与左值表达式
p
结合使用是非常好的,即使它不是数组类型。事实上,
buf[0]
表达式也被编译器内部翻译为
*(buf+0)

您是否误解为您创建了指向
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个指向整数的指针组成的数组

int**test=newint*[7]

+------++------++------++------++------++------++------+
| int* || int* || int* || int* || int* || int* || int* |
+------++------++------++------++------++------++------+
是具有int指针的数组的等效项:

int* test[0] 
int* test[1] 
...
int* test[6] 
这个

int x = 7;
test[1] = &x
cout << *test[1] 
现在,原始数组中的一个指针指向x的内存位置

 cout << (**(test+1));

不能只是从其他坚定分子手中接过指挥棒。如果问这个是愚蠢的,那么在混乱的情况下不问是错误的。我知道。我不明白的是,为什么测试[1]指向一些合理的东西。在我的理解中,测试是指向指针的指针,而指针又有一堆内存。这样:test->array[0][1][2][3][..]调用test[1]不应该做任何事情,我想我需要调用array[1]。@chubsdad:请看我对Marcelo的评论。我不明白为什么我应该能够取消引用测试,就像它是一个带有[]的数组一样。据我所知,测试不是数组,而是指针。数组位于第二个指针内。@Blub:对于给定的“p”,例如“T*p;”,其中“T”是非void类型,是积分表达式“i”,表达式
p[i]
基本上等同于
*(p+i)
。编译器不会仅对静态已知的数组类型对象限制此语法。
p[i]
反过来也是指向数组的指针这一事实并没有改变基本规则
p[i]=*(p+i)
int(*test)[7]是指向int[7]的指针,对吗?一维数组怎么可能包含二维。。。我想你找到了另一件我不懂的东西。但我现在明白了我最初的问题:)我自己重述一下:指针算法通过向内存地址添加字节偏移量来工作。未初始化的指针尚未指向任何对象,因此我无法在其上使用指针数学。我在网上找不到任何高级教程来处理诸如int(test)[]和inttest[]差异之类的精细语法更改。你有什么建议我可以在哪里读到吗?@Blub它实际上不包含二维空间。就像
int*p=newint[1]。您可以问“标量如何容纳数组?”。答案是相反的:数组包含标量(p指向),2维数组包含1维数组(我们指向)。
 cout << (**(test+1));
cout << *test[1]