5

当我尝试仅使用这两行的测试程序时

char array[256];
char** arrayPointer=&array;

我得到错误

无法从 char*[256] 转换为 char**。

然而,如果我这样做:

char array[256];
char* temp=array;
char** arrayPointer=&temp;

我没有得到这样的抱怨。

我认为这是 eclipse 的错误行为(我的 eclipase 现在的行为很有趣)但是当我尝试为该函数做一个 to 的&array转换char**时,我最终出现了异常行为,并且我的调试器暗示该数组没有被修改正如它应该。

PS。所有这些都是手写的,请原谅错别字。

4

1 回答 1

15

在 C++ 中,数组和指针不是一回事。数组在很多情况下可以隐式转换为指针,但是数组类型和指针类型是不同的。

在你的情况下,变量

char array[256];

有类型char[256]。如果你通过写来获取它的地址,你会得到一个指向 256 s&array数组的指针,它的类型是。这不一样了。这实际上是一件好事。如果你可以进行转换,如果你这样做会发生什么?charchar (*)[256]char**

char array[256];
char** ptrPtr = &array; // Not legal!
*ptrPtr = new char[256];

在这种情况下,第三行将“重新分配”array以指向一个包含 256 个元素的新数组。但是,array不是指针!这个操作没有意义。

编写时出现奇怪的调试器错误的原因

char array[256];
char** ptrPtr = (char**) &array; // Legal, but Bad Times!
*ptrPtr = new char[256];

是您投入的演员表会导致未定义的行为。您假装指向 256 个实际char对象的数组的指针实际上是指向 a 的指针的指针char。这是一个毫无意义的演员表,所以当你这样做时,所有的赌注都没有了。

另一方面,如果您显式引入这样的char*变量:

char array[256];
char* ptr = array;
char** ptrPtr = &ptr;

然后一切都很好。在第二行中,您创建一个指针(实际类型char*),它指向 的第一个元素array。在第三行中,您创建一个指向该新指针的指针。如果你再写

*ptrPtr = new char[137];

然后没有什么不好的事情发生;您刚刚更改了ptr指向的位置,并且没有破坏array.

希望这可以帮助!

于 2012-06-21T21:04:34.637 回答