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 *。大神的解答如下:
对于内存、可执行文件理解不够,暂时不能理解。
查阅网上文献得出在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型变量的变量名,并不是一个有效地址。