一般情況下
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; }