无法从字符*[]转换为字符**

Can't convert from char*[] to char**

本文关键字:字符 转换      更新时间:2023-10-16

当我只用这两行尝试测试程序时

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

我收到错误

无法从字符*[256]转换为字符**。

然而,如果我这样做:

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

我没有得到这样的抱怨。

我认为这是日食表演错误(我的日食现在表现得很有趣),但是当我尝试为函数char** &array进行强制转换时,我最终出现了异常行为和我的调试器暗示数组没有被修改为应有的方式。

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

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

在您的情况下,变量

char array[256];

具有类型 char[256] 。 如果通过写入 &array 来获取其地址,则会得到一个指向 256 char s 的数组的指针,该数组的类型为 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

希望这有帮助!