|
发表于 2024-1-4 09:29:18
|
显示全部楼层
本帖最后由 zhaokg 于 2024-1-4 09:48 编辑
很好的讨论。 这里是C语言标准说的 (https://en.cppreference.com/w/c/language/array_initialization):
String literal (optionally enclosed in braces) may be used as the initializer for an array of matching type
据此,
(1) const char arr[]= "abc";
(2) const char arr[]= {"abc"};
这2者是一样的, the braces 可有可无。 像你说的一样,就是一种syntactic sugar,等同于
const char arr[]= {'a','b', 'c', '\0'};
但是const char * arr[]={"abc"}完全不一样, 这里不涉及到字符数组的初始化, 因为arr是一个数组,每个元素不是char,而是一个指针。 而在C语言中(除了上面(1) and (2)二中情况), a string literal (e.g., “abc",存在与程序的read-only constant段)可以认为是一个const char *类型 (比如printf(”%s", pchar) 和 printf(“%s", "abc")中)。
在const char * arr[]={"abc"}总, arr是一个只有1个元素的数组,它的第一个元素内容是一个指向“abc"的指针。
可以理解为这样:
const char * pchar ="abc";
const char * arr[] ={pchar};
另外一个例子
const char arr[]={"abc","xyz"}; 这就错了, 因为这个不能转化为 const char arr[]="abc""xyz", 所以试图把2个指针(总共8+8 bytes)赋给二个字符(1+1 bytes), 肯定会出错, 为了理解, 它类似于 const void * arr[]={"abc", "xyz"};
|
|