const char *pt1="123";
const char *pt2={'1', '2', '3', '\0'};
是一样的吗?后者无法编译。
错误:标量对象“pt2”在初始化程序中需要一个元素
为什么?不"123"
一样{'1', '2', '3', '\0'}
吗?
我可以使用delete[] pt1
释放资源还是仅仅释放资源delete pt1
?
不,它们不一样。第一个是字符串文字,第二个是带有 type 元素的初始化列表char
。
您可以像这样使用第二种语法:
const char pt2[]={'1', '2', '3', '\0'};
但即使在这种情况下,它们也不相同:
const char *pt1="123";
在这种情况下"123"
将存储在只读存储器中。pt1
只是指向它。
const char pt2[]={'1', '2', '3', '\0'};
但在此所有元素都将被复制到 pt2 中。
可以使用 delete [] pt1 释放资源还是只删除 pt?
不,你不能
(Aclually,这是可能的,但你不应该这样做)
在 C++ 中没有办法做到这一点。不,您尝试使用聚合初始值设定项与字符串文字不同。聚合初始值设定项{'1', '2', '3', '\0'}
不引入数组。
附带说明一下,在 C 语言中,为了通过非字符串文字实现数组对象,您必须使用称为复合文字的 C99 功能,使用以下语法
const char *pt2 = (const char []) {'1', '2', '3', '\0'};
这与使用字符串文字得到的几乎相同。但是有一个区别:字符串文字始终具有静态存储持续时间,而本地使用的复合文字将具有自动存储持续时间。
它失败了,因为您声明的是指针,而不是数组。指针是一种标量类型,因此不能将具有多个元素的初始值设定项列表分配给它。
您可能将此与以下内容混淆:
const char pt2[] = {'1', '2', '3', '\0'};
这是不一样的。
const char *pt2={'1', '2', '3', '\0'};
该语言不允许使用初始化列表来初始化指针,指针需要存储在其中的内存地址。初始化列表不返回任何内存地址。
const char *pt1="123";
这是一个字符串文字,已在语言中定义,将分配在只读数据段上,并由 自动终止\0
。ptr
是一个指针char
,可以指向一个数组char
或单个数组char
。因为,""
已定义的文字被确认以\0
它作为字符串结尾的指示符结束,您可以这样做。