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

时间:2012-06-21 20:59:58

标签: c++ arrays pointers

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

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

我收到错误

  

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

但如果我这样做:

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

我没有这样的抱怨。

我认为这是eclipse表演的错误(我的eclipase现在表现得很滑稽)但是当我试图对&array进行char**的演员表演时,我的结果是不寻常的行为和我的调试器暗示数组没有被修改。

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

1 个答案:

答案 0 :(得分:12)

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

在您的情况下,变量

char array[256];

的类型为char[256]。如果通过编写&array来获取其地址,则会得到一个指向256 char个数组的指针,其类型为char (*)[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对象的数组的指针实际上是指向char指针的指针。这是一个毫无意义的演员阵容,所以当你这样做时,所有的赌注都会被取消。

另一方面,如果您明确地引入char*变量,如下所示:

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

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

*ptrPtr = new char[137];

然后没有坏事发生;你刚刚改变了ptr指向的位置,并没有销毁array

希望这有帮助!