c++ - 为什么不能将 char 指针定义为数组?

标签 c++ initialization c-strings

简单的问题。我知道我应该只使用 std::string,但很好奇为什么会这样:

const char* example = "test";

虽然这会导致第二个字符出现“过多的初始化值”?

const char* example = {0x74, 0x65, 0x73, 0x74, 0x00};

这两个东西不应该完全等价吗?

最佳答案

不同之处在于字符串字面量是它们自己的数组。 "test" 在这里不是用作数组的初始值设定项(一种特殊情况,它等同于 { 't', 'e', 's', 't', '\0' }),但与任何其他值的方式相同。

换句话说,当您在代码中使用字符串文字 "test" 时,编译器会自动创建类似于

static const char __str_literal0[] = {'t', 'e', 's', 't', '\0'};

然后

const char *example = "test";

被编译成

const char *example = __str_literal0;

即它只是指向(已经存在的静态)字符数组。

另一方面,如果您尝试使用初始化列表,编译器会将变量的第一个字段(即 example 本身)设置为初始化列表中的第一个值(example = 0x74),然后提示你的列表中有太多的初始化器。

关于c++ - 为什么不能将 char 指针定义为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136287/

相关文章:

c++ - 如何为 _beginthreadex 提供 64 位线程标识符

c++ - 确定 QTreeWidget 列的可见大小

c++ - linux下编译C++文件

c - 不明白为什么会出现段错误

c - 打印字符数组

c# - 如何将图像从 C# 发送到正确接受 OpenCV Mat 的 DLL?

python - PyQt:初始化重置的默认值

ruby-on-rails - 如何/何时/在哪里扩展 Rails 3 中的 Gem 类(通过 class_eval 和模块)?

c++ - 使用转换函数直接初始化

c - 使用字符串和数组