const char str1[] = {"abc"};
const char str2[] = {'a', 'b', 'c', '\0'};
const char str3[] = {97, 98, 99, '\0'};
这些操作是因为C 2018 6.7.9中有关如何处理初始值设定项的规则:
- 在
const char str1[] = {"abc"};
中,给出一个字符串文字来初始化包含const char
的array.6.7.9 14表示"字符类型的数组可由字符串文字或UTF-8字符串文字初始化,可选地用大括号括起来.字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素."
- 在
const char str2[] = {'a', 'b', 'c', '\0'};
中,给出了一个包含int
个值(字符常量的类型为int
)的列表来初始化array.6.7.9 17告诉我们,它们用于按顺序初始化数组的子对象(其元素).
const char * str_arr[] = {"abc", "ABCD"};
const char * str_arr[] = { str1, str2, str3 };
对于这些项目:
- 在
const char * str_arr[] = {"abc", "ABCD"};
中,字符串列表用于初始化指针array.请注意,这不是用大括号括起来的a个字符串文字;而是two个字符串文字,因此它与上面的规则不匹配.对于使用字符串文字来初始化指针数组而不是字符类型的数组,没有特殊的规则,因此使用C的其他规则来处理它,并且两个字符串文字初始化数组的两个元素.字符串文字指定一个字符array.6.3.2.1 3表示,当数组不是sizeof
的操作数、一元&
的操作数或用于初始化数组的字符串文字时,它将被转换为指向其第一个元素的指针.因此,这两个数组中由字符串文字指定的每个数组都被转换为指向其第一个元素的指针,这些指针成为str_arr
的初始值.
- 在
const char * str_arr[] = { str1, str2, str3 };
、str1
、str2
和str3
中是array.如上所述,它们被自动转换为指向它们的第一个元素的指针,并且这些指针被用来初始化str_arr
.
const char * str_arr[] = { {'a', 'b', 'c', '\0'}, {'A', 'B', 'C', 'D', '\0'} };
为此,str_arr
的每个元素都是const char *
,为它提供的初始值设定项是{'a', 'b', 'c', '\0'}
.C中没有规定const char *
可以用大括号中的int
个值的列表进行初始化.当{'a', 'b', 'c', '\0'}
出现在初始值设定项中时,它作为数组没有任何特殊意义.它只是一个值的列表.如何处理该值列表取决于初始化的上下文.如果有要填充的数组,则可以使用列表中的值来填充数组元素.但是没有数组,也没有规则规定将这个值列表组成一个数组,并创建一个指向该数组的指针.