指向指针数组的指针理解问题

时间:2010-09-05 12:30:34

标签: c++ pointers

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

 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.

我的错误思考在哪里?

4 个答案:

答案 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}}。