这可能是一个愚蠢的问题,但我不明白为什么会这样:
int** test = new int*[7];
int x = 7;
*(test+1) = &x;
cout << (**(test+1));
test是一个指向指针的指针吗?第二个指针指向数组,对吗? 据我所知,我需要先取消引用“test”指针才能找到具有数组的指针。
(*test) // Now I have int*
*((*test) + 1) // to access the first element.
我的错误思考在哪里?
答案 0 :(得分:12)
int ** test = new int * [7];
+------++------++------++------++------++------++------+
| int* || int* || int* || int* || int* || int* || int* |
+------++------++------++------++------++------++------+
相当于带有int指针的数组:
int* test[0]
int* test[1]
...
int* test[6]
此
int x = 7;
*(test+1) = &x;
+------++------++------++------++------++------++------+
| int* || &x || int* || int* || int* || int* || int* |
+------++------++------++------++------++------++------+
与
相同int x = 7;
test[1] = &x
所以现在原始数组中的一个指针指向x
的内存位置 cout << (**(test+1));
与
相同cout << *test[1]
这是x(== 7)的值,并且测试[1]和&amp; x都指向。
答案 1 :(得分:9)
您是否认为自己已经创建了指向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];
也就是说,你创建了一个单元素数组,其中元素类型是一个7元素的int数组。 new
为您提供指向该数组的指针。请注意,括号很重要:*
的优先级低于[7]
,否则这将被视为指向整数的7指针数组。
答案 2 :(得分:1)
假设
test[0] = 0x12345678; // some pointer value
test[1] = 0x23456789; // some pointer value
* test = 0x12345678;
* test + 1现在是0x12345678 + 1 = 0x12345679;
* or dereference operator has higher precedence than binary +)
。因此,表达式按此顺序进行评估。
然而你想要的是测试[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.
请注意,使用lvalue表达式p
的数组访问语法是完全正确的,即使它不是数组类型。实际上,表达式buf[0]
也由编译器内部翻译为*(buf + 0)
。
答案 3 :(得分:0)
表达式*(test + 1)
相当于test[1]
,因此您的代码可以重写:
int** test = new int*[7];
int x = 7;
test[1] = &x;
cout << *test[1];
由于test[1]
显然指向x
,*test[1]
为7
。
为了清楚起见,表达式**(test + 1)
只相当于*(*(test + 1))
,而*test[1]
相当于{{1}}。