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

The*_*ain 4 c++ gcc char google-nativeclient c++11

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

const char*
Run Code Online (Sandbox Code Playgroud)

和

const char[]
Run Code Online (Sandbox Code Playgroud)

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

namespace SomeNamespace {
    const char* str = { 'b', 'l', 'a', 'h' };
}
Run Code Online (Sandbox Code Playgroud)

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

namespace SomeNamespace {
    const char str[] = { 'b', 'l', 'a', 'h' };
}
Run Code Online (Sandbox Code Playgroud)

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

void Func() {
    const char* str = { 'b', 'l', 'a', 'h' };
}
Run Code Online (Sandbox Code Playgroud)

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

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

Die*_*ühl 5

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

char const* str = ...;
Run Code Online (Sandbox Code Playgroud)

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

char const str[] = ...;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @IInspectable:否。声明为“char const x[]”和“char const* x”的函数参数是相同的。然而,当它们用作“typdef”时,它们实际上是不同的,但我还没有完全弄清楚如何不同。这是一个测试: `void f(char const x[], char const* y) { std::cout << std::is_same<decltype(x), decltype(y)>::value << '\n '; }`。 (2认同)
  • @DietmarKühl [修改示例](http://ideone.com/iZ318W) 来演示我*认为*您所指的有关 typedef 差异的内容(奇怪的是,相同)。这才是真正的面条师傅。我想我可能终于找到了我的第一个SO问题。谢谢。 (2认同)