为什么不能将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是直接的 - 初始化(在直接列表初始化中)或复制初始化(在复制列表初始化中),但不允许缩小转换。
const char* example = {0x74};
为了阻止编译器抱怨参数的数量,它仍然是一个错误,因为对于有效的copy-initialization
,你需要提供a pointer而不是int。
char a = 'c';
const char* example = {&a};
以上是关于为什么不能将char指针定义为数组?的主要内容,如果未能解决你的问题,请参考以下文章
不能将int类型的值分配到int类型的实体,是啥意思?例如int *a[10];a[0]=j-i;(i、j均为指针)。