一般情况下
char* string = "abc";
编译后会出现标题中的错误。
我们只需要在字符串前加上const_cast<char*>即可,这个作用是丢弃变量的const声明,但不能改变变量所指向的对象的const属性。即:const_cast用于原本非const的对象;如果用于原本const的对象,结果不可预知(C++语言未对此种情况进行规定)
char* string = const_cast<char*>("abc");
另外补充: char * 是分配在字符串常量区的,所以不可改变指向的值,但是可以改变指针的地址
char[] 是分配在栈上的,可以改变指向的值,但不可以改变指针的地址
参见: https://blog.csdn.net/qq_32783703/article/details/87707766
#include <iostream> #pragma warning(disable:4996) int main() { char **aaa = new char*[3]; char **bbb = aaa; std::string s1 = "123"; std::string s2 = "567"; *aaa++ = const_cast<char*>(s1.c_str()); *aaa++ = const_cast<char*>(s2.c_str()); *aaa = const_cast<char*>("0"); // 输出 123 567 0 std::cout<<*bbb<<std::endl; std::cout<<*(bbb+1)<<std::endl; std::cout<<*(bbb+2)<<std::endl; // 输出 2 std::cout<<*(*bbb+1)<<std::endl; // 输出 5 6 7 空格 // 取 xxx 指针数组中第二个字符串地址-> *(bbb+1) // 再取字符串中的单个字符地址-> *(*(bbb+1)+1) // 需要说明的是,bbb 是字符串地址的地址 std::cout<<**(bbb+1)<<std::endl; std::cout<<*(*(bbb+1)+1)<<std::endl; std::cout<<*(*(bbb+1)+2)<<std::endl; std::cout<<*(*(bbb+1)+3)<<std::endl; // 输出空格 std::cout<<*(*(bbb+2)+5)<<std::endl; return 0; }