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

我明白了

char *s = "Hello World!" ; 

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

这和

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

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

【问题讨论】:

  • 第一种方式已弃用且危险。

标签: c++ char constants


【解决方案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[]>不是更符合逻辑吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2010-10-27
  • 2012-04-07
相关资源
最近更新 更多