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

dso*_*len 3 c++ arrays pointers

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

char array[256];
char** arrayPointer=&array;
Run Code Online (Sandbox Code Playgroud)

我收到了错误

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

但如果我这样做:

char array[256];
char* temp=array;
char** arrayPointer=&temp;
Run Code Online (Sandbox Code Playgroud)

我没有这样的抱怨.

我想,这是日食行动车(这我eclipase搞笑演技现在),但是当我试图做的一个投&arraychar**了我结束了不正常的行为和我的调试器这意味着该数组不被修改的功能正如它应该.

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

tem*_*def 12

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

在你的情况下,变量

char array[256];
Run Code Online (Sandbox Code Playgroud)

有类型char[256].如果通过写入获取其地址&array,则会获得指向256 chars 数组的指针,该数组具有类型char (*)[256].这不一样了char**.这实际上是件好事.如果你可以进行转换,如果你这样做会发生什么?

char array[256];
char** ptrPtr = &array; // Not legal!
*ptrPtr = new char[256];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第三行将"重新分配" array以指向256个元素的新数组.但是,array不是指针!这种操作毫无意义.

你在编写时遇到奇怪的调试器错误的原因

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

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

另一方面,如果你明确地引入这样的char*变量:

char array[256];
char* ptr = array;
char** ptrPtr = &ptr;
Run Code Online (Sandbox Code Playgroud)

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

*ptrPtr = new char[137];
Run Code Online (Sandbox Code Playgroud)

然后没有坏事发生; 你刚刚改变了ptr指向的地方,并没有破坏array.

希望这可以帮助!

  • @dsollen- C和C++都不会将数组视为指向序列第一个字符的指针.在C和C++中,数组是一个类型的对象的连续块.数组可以*衰减*到指向其第一个元素的指针,但它实际上不是指向第一个元素的指针."重新分配"数组没有意义的原因是你不能"重新分配"一个元素块作为另一个元素块.这有点澄清一点吗? (2认同)