const char *pt1="123";
const char *pt2={'1', '2', '3', '\0'};
它是一样的吗?后者无法编译。
错误:标量对象'pt2'在初始值设定项中需要一个元素
为什么呢? "123"
与{'1', '2', '3', '\0'}
不相同吗?
我可以使用delete[] pt1
来发布资源,还是只使用delete pt1
?
答案 0 :(得分:9)
不,他们不一样。第一个是字符串文字,第二个是初始化列表,其元素类型为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?
不,你不能
(有可能,但你不应该这样做)
答案 1 :(得分:4)
在C ++中无法做到这一点。不,您尝试使用聚合初始值设定项与字符串文字不同。像{'1', '2', '3', '\0'}
这样的Agggregate初始化器不会引入数组。
作为旁注,在C语言中,为了通过非字符串文字实现数组对象,您必须使用名为复合文字的C99功能,使用以下语法
const char *pt2 = (const char []) {'1', '2', '3', '\0'};
这与使用字符串文字得到的几乎相同。但是有一个区别:字符串文字始终具有静态存储持续时间,而本地使用的复合文字将具有自动存储持续时间。
答案 2 :(得分:2)
它失败是因为你声明了一个指针,而不是一个数组。指针是标量类型,因此无法为其分配具有多个元素的初始化列表。
你可能会对此感到困惑:
const char pt2[] = {'1', '2', '3', '\0'};
哪个不一样。
答案 3 :(得分:1)
const char *pt2={'1', '2', '3', '\0'};
该语言不允许使用初始化列表初始化指针,指针需要存储在其中的内存地址。初始化列表不返回任何内存地址。
const char *pt1="123";
这是一个字符串文字,它已在要在只读数据段上分配的语言中定义,并由\0
自动终止。 ptr
是指向char
的指针,可以指向char
或单char
的数组。因为,""
定义的文字被确认以\0
结尾,{{1}}作为字符串结尾的指示符,你可以这样做。