Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么常量char*pt2={';1';,';2';,';3';,';\0';can';不编译?_C++_String - Fatal编程技术网

C++ 为什么常量char*pt2={';1';,';2';,';3';,';\0';can';不编译?

C++ 为什么常量char*pt2={';1';,';2';,';3';,';\0';can';不编译?,c++,string,C++,String,是一样的吗?后者无法编译 错误:标量对象“pt2”需要初始值设定项中的一个元素 为什么??“123”与{'1'、'2'、'3'、'\0'}不一样吗 我可以使用delete[]pt1释放资源,还是只使用delete pt1?否,它们不一样。第一个是字符串文字,第二个是带有char类型元素的初始值设定项列表 您可以使用如下第二种语法: const char *pt1="123"; const char *pt2={'1', '2', '3', '\0'}; 但即使在这种情况下,它们也不相同: co

是一样的吗?后者无法编译

错误:标量对象“pt2”需要初始值设定项中的一个元素

为什么??
“123”
{'1'、'2'、'3'、'\0'}
不一样吗


我可以使用
delete[]pt1
释放资源,还是只使用
delete pt1

否,它们不一样。第一个是字符串文字,第二个是带有
char
类型元素的初始值设定项列表

您可以使用如下第二种语法:

const char *pt1="123";
const char *pt2={'1', '2', '3', '\0'};
但即使在这种情况下,它们也不相同:

const char pt2[]={'1', '2', '3', '\0'};
在这种情况下,
“123”
将存储在只读存储器中<代码>pt1只需指向它即可

const char *pt1="123";
但在这种情况下,所有元素都将被复制到pt2中

可以使用delete[]pt1释放资源,还是只删除pt

不,你不能


(通常,这是可能的,但您不应该这样做)

它失败了,因为您声明的是指针,而不是数组。指针是标量类型,因此不能为其分配具有多个元素的初始值设定项列表

你可能把这和:

const char pt2[]={'1', '2', '3', '\0'};

不一样。

在C++中没有办法。不,您尝试使用聚合初始值设定项与字符串文本不同。像
{'1','2','3','0'}
这样的聚合初始值设定项不引入数组

作为旁注,在C语言中,为了通过非字符串文字实现数组对象,必须使用C99特性,称为复合文字,并使用以下语法

const char pt2[] = {'1', '2', '3', '\0'};
这与使用stringliteral得到的结果几乎相同。不过有一个区别:字符串文字始终具有静态存储持续时间,而本地使用的复合文字将具有自动存储持续时间

const char *pt2 = (const char []) {'1', '2', '3', '\0'};
该语言不允许使用初始化器列表初始化指针,指针需要存储内存地址。初始化器列表不返回任何内存地址

const char *pt2={'1', '2', '3', '\0'};

这是一个字符串文字,已在要分配给只读数据段的语言中定义,并由
\0
自动终止
ptr
是指向
char
的指针,可以指向
char
数组或单个
char
。因为,
定义的文字被确认为以
\0
结尾,它作为字符串结尾的指示器,所以您可以这样做。

hw如何理解字符串文字?它不是一个字符数组吗?通过使用语法“123”,您正在创建一个特定的字符数组,以只读方式存储mem@jiafu字符串文字是字符串文字。它是一个类型为“array of n
const char
”的文本,因此可以将其转换为指向
const char
的指针。
{}
语法是一个初始化器列表,它执行所声明变量的聚合初始化。它不是数组,因此无法转换为指针。是否删除每个指针?此内存不是动态分配的,因此,您没有理由删除它。不,不是指针,而是内存。您可以使用
new
分配内存,但不在代码中使用它。因此,您不需要
删除它。C中的复合文字是存储在二进制文件的只读部分(如字符串文字)还是在运行时复制的(如“soon”的答案中的
pt2
)@leems:当它在本地使用时,它会生成一个本地对象,这意味着它必须在运行时构建。它是如何构建的——通过从只读内存复制,或者通过逐段在适当的位置初始化——是一个实现细节。所以,是的,它应该与soon的答案基本相同。有趣的信息Andrey。感谢包括它,即使它是C而不是C++。关于<代码> const char tMP[] = {’1’,‘2’,’3’,’0’};常量字符*pt2=tmp
,是否与
pt1
相同,即指向运行时未复制的只读内存的指针?@leemes
tmp
相当于
&tmp[0]
,因此
pt2=tmp
使
pt2
指向
tmp[0]
。这是显而易见的,但我的意思是:数组内容是复制/初始化到
tmp
还是
tmp
本身只是指向程序只读部分的指针,就像字符串文字一样?也就是说,初始化
tmp
是否是
O(1)
?@leems因为它是
const
,所以可以避免复制。但我认为这取决于编译器。检查生成的程序集显示,关闭优化后,GCC和Clang不复制,而英特尔C++则复制。使用优化后,英特尔C++也不复制。
const char *pt1="123";