4

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

const char*

const char[]

有一段时间,我认为数组只是指针的语法糖。但是有些事情困扰着我,我有一段类似于以下的代码:

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

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

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

它起作用了,起初我认为这可能与以下事实有关但错误似乎并非如此。然而在:

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

它按预期编译得很好。有谁知道为什么会这样?

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

4

1 回答 1

5

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

char const* str = ...;

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

char const str[] = ...;

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

注意在某些情况下char const x[] 可以等价于写char const* x:当你声明一个函数参数时,char const x[]实际上与char const*.

于 2013-09-05T00:07:49.647 回答