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

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

错误:标量对象“pt2”在初始化程序中需要一个元素

为什么?不"123"一样{'1', '2', '3', '\0'}吗?

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

4

4 回答 4

9

不,它们不一样。第一个是字符串文字,第二个是带有 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,这是可能的,但你不应该这样做

于 2013-05-29T07:37:19.030 回答
4

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

附带说明一下,在 C 语言中,为了通过非字符串文字实现数组对象,您必须使用称为复合文字的 C99 功能,使用以下语法

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

这与使用字符串文字得到的几乎相同。但是有一个区别:字符串文字始终具有静态存储持续时间,而本地使用的复合文字将具有自动存储持续时间。

于 2013-05-29T07:43:06.663 回答
2

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

您可能将此与以下内容混淆:

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

这是不一样的。

于 2013-05-29T07:40:04.513 回答
1
const char *pt2={'1', '2', '3', '\0'};

该语言不允许使用初始化列表来初始化指针,指针需要存储在其中的内存地址。初始化列表不返回任何内存地址。

const char *pt1="123"; 

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

于 2013-05-29T07:43:44.947 回答