ISO C++11 doesn't allow conversion from string literal to 'char*'

string类型与char const *类型

在做书上的例题是遇到如下问题:

int main()
{
    char *pch = "abc"; // caution:ISO C++11 doesn't allow conversion from string literal to 'char*'
    cout<cout<<(void*)pch<

困惑于char*直接指向一个字符串,既没有分配动态内存也没有指向一个已声明的变量。

一般来说,字符串可以被隐式类型转换为char const *。大神的解答如下:
ISO C++11 doesn't 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++)