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