warning: ISO C++11 does not allow conversion from string literal to ‘char *‘

string类型与char const *类型
在做书上的例题是遇到如下问题:

int main(int argc,char *argv[])
{
     
    char *pch = "abc"; // caution:ISO C++11 doesn't allow conversion from string literal to 'char*'
    cout<<pch<<endl;
    cout<<(void*)pch<<endl;
    return 0;
}

困惑于char*直接指向一个字符串,既没有分配动态内存也没有指向一个已声明的变量。
一般来说,字符串可以被隐式类型转换为char const *。大神的解答如下:
warning: ISO C++11 does not allow conversion from string literal to ‘char *‘_第1张图片
对于内存、可执行文件理解不够,暂时不能理解。
查阅网上文献得出在ISO C++03中这种表达是可以的,而看来会引发一些错误,因此在ISO C++11中取消了这种表达。
有如下解决办法:
将指针转换为char const *类型

char const* pch = "abc";

文献里说是最为正确,避免错误的方法,将字符串强制转换为char*类型

char *pch = (char*)"abc"

文献翻译为:由于C++11并没有取消强制类型转换,这样也可以正常编译。但这样和隐式类型转换本质上是相同的,依旧有可能发生所谓错误。建议使用例一的方法。
字符与char*类型

char *pch='a';
char *pch=&'a';

第一行由于’a’是一个char类型的字符,并不是一个有效的地址,无法用来初始化char*
第二行由于无法直接取到’a’这个char类型字符的地址。
解决办法:动态内存申请或者初始化一个新变量
动态内存的申请:

char *pch=new char('a');

新变量:

char ch='a';
char *pch=&ch;

注意:char *pch=ch是 错误的,因为ch是一个char型变量的变量名,并不是一个有效地址。

你可能感兴趣的:(#,C/C++,c++)