我读了一个关于区别的问题:
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)。
答案 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}}。