C ++在const char *和const char []之间的区别

时间:2013-09-04 23:57:49

标签: c++ gcc c++11 char google-nativeclient

我读了一个关于区别的问题:

const char*

const char[]

虽然有一段时间,我虽然数组只是指针的语法糖。 但有些事情让我烦恼,我有一些代码如下:

namespace SomeNamespace {
    const char* str = { 'b', 'l', 'a', 'h' };
}

我得到,错误:缩放器对象'str'在初始化器中需要一个元素。 所以,我试过这个:

namespace SomeNamespace {
    const char str[] = { 'b', 'l', 'a', 'h' };
}

起作用,起初我认为这可能与应用额外操作的事实有关 当它是一个const char *时,GCC绝不是在函数外执行的操作的粉丝(无论如何都是不好的做法),但错误似乎并不是这样的。 但是在:

void Func() {
    const char* str = { 'b', 'l', 'a', 'h' };
}

按预期编译就好了。有谁知道为什么会这样?

x86_64 / i686-nacl-gcc 4(.1.4?)pepper 19工具 - 链(基本上是GCC)。

1 个答案:

答案 0 :(得分:5)

首先,如果您尝试在命名空间范围或函数中使用复合初始化,它没有任何区别:两者都不应该工作!当你写

char const* str = ...;

你有一个指向char序列的指针,例如可以用字符串文字初始化。在任何情况下,char都位于指针之外的其他位置。另一方面,当你写

char const str[] = ...;

您定义了一个char的数组。数组的大小由右侧元素的数量决定,例如,变为4的示例{ 'b', 'l', 'a', 'h' }。如果你使用了例如"blah",那么大小当然是5.数组的元素被复制到这种情况下定义str的位置。

请注意,char const x[] 可以等同于在某些上下文中编写char const* x:当您声明函数参数时,char const x[]实际上与{{char const*相同1}}。