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

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)。

最佳答案

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

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* 相同。

关于C++ const char* 和 const char[] 的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18625674/

10-12 14:24
查看更多