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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不能将char指针定义为数组?相关的知识,希望对你有一定的参考价值。

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

const char* example = "test";

虽然这导致第二个字符“初始化程序值太多”?

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

这两件事不应该完全相同吗?

答案

区别在于字符串文字是它们自己的数组。这里使用"test"不是作为数组的初始化器(一种特殊情况,它将等同于{ 't', 'e', 's', 't', '' }),但与任何其他值的方式相同。

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

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

然后

const char *example = "test";

被编译好像是

const char *example = __str_literal0;

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

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

另一答案

这两件事不应该完全相同吗?

在你的第二个例子中,你试图使用copy-list initialization初始化一个指针,这与你的第一个例子的等效性相当。

否则(如果T不是类类型),如果braced-init-list只有一个元素,并且T不是引用类型或者是与元素类型兼容的引用类型,则T是直接的 - 初始化(在直接列表初始化中)或复制初始化(在复制列表初始化中),但不允许缩小转换。

即使你supply only one element

const char* example = {0x74};

为了阻止编译器抱怨参数的数量,它仍然是一个错误,因为对于有效的copy-initialization,你需要提供a pointer而不是int。

char a = 'c';
const char* example = {&a};

以上是关于为什么不能将char指针定义为数组?的主要内容,如果未能解决你的问题,请参考以下文章

C中函数形参声明为数组形式,它其实是指针

不能将int类型的值分配到int类型的实体,是啥意思?例如int *a[10];a[0]=j-i;(i、j均为指针)。

我想定义一个字符串指针数组,使用下面语句: static char *ch[10]; 但提示错误,求解

C语言中char数组与char指针问题

c语言中,为啥不能对字符指针变量指向的字符串再赋值?

qt 中能不能用一个指向数组的指针对另一个数组赋值