const char * 和 char *

Posted

技术标签:

【中文标题】const char * 和 char *【英文标题】:const char * and char * 【发布时间】:2013-03-20 05:19:21 【问题描述】:

我明白了

char *s = "Hello World!" ; 

存储在只读内存中,字符串文字不能通过指针修改。

这和

有什么不同
const char *s = "Hello World!"; 

'string' char * 或 const char * 的类型也是?

【问题讨论】:

第一种方式已弃用且危险。 【参考方案1】:

通过将类型指定为const char *,它会更难意外覆盖内存,因为如果您尝试编译器会出错:

const char *s = "Hello World!";
s[0] = 'X';  // compile error

如果你不使用const,那么问题可能要到运行时才被发现,或者它可能只是导致你的程序出现细微的错误。

【讨论】:

哦,是的,我看到尝试修改 char *s 编译成功,但 const char *s 没有。所以基本上把 const 当作一个危险信号来不改变字符串。酷!【参考方案2】:

区别在于后者是合法的,而前者是不合法的。这是在 C++11 中所做的更改。形式上,"Hello World!" 的类型为 const char[13];它可以转换为const char*。在过去,它的类型可能是char[13],可以转换为char*。 C++ 通过添加const 更改了数组的类型,但保留了对char* 的转换,以便使用char* 的现有C 代码可以在C++ 中工作,但修改指针指向的文本会产生未定义的行为。 C++11去掉了对char*的转换,所以现在只能合法做

const char *s = "Hello world!";

【讨论】:

C++11 removed the conversion to char* -- 不在 gcc48 中。这是 gcc 错误吗? @LeonidVolnitsky - 在 C++11 中不允许转换。规则是编译器必须为违反没有说“不需要诊断”的约束发出诊断。因此,所需要的只是诊断,有时是警告。 如果添加const会改变类型,const<char*>const<char[]>不是更符合逻辑吗?

以上是关于const char * 和 char *的主要内容,如果未能解决你的问题,请参考以下文章

如何将char赋给const char *

如何使用 UTF-8 字符序列在 C++ 中初始化 const char* 和/或 const std::string?

const char* 和 char* const

无法在 git bash 终端中使用 char[] PASSWORD =cons.read Password 运行密码屏蔽

常量, char[], const char[], char*, const char*, char* const以及const char* const的详解

const char*和char* const的区别