这些声明之间的区别?
1
char **strings = {"abc", "bca", "rat", "tar", "far"};
2
char *strings[] = {"abc", "bca", "rat", "tar", "far"};
3
char strings[][] = {"abc", "bca", "rat", "tar", "far"};
只有(2)是有效的声明。这些类型之间有什么区别,为什么(1)和(3)无效?
答案 0 :(得分:12)
char **strings
是指向char
指针的指针。它是一个有效的类型,但你不能像你想要的那样使用数组初始化器初始化它。
char *strings[]
是指向char
的指针数组,您的初始化有效。
char strings[][]
是尝试制作二维数组,但这是错误的,因为您必须指定除最外层之外的所有维度的大小(最外层大小可以从初始化程序中推断出来)。所以这是有效的:
char strings[][4] = {"abc", "bca", "rat", "tar", "far"};
答案 1 :(得分:2)
C99支持复合文字,因此您可以分配数组初始值设定项。所以案例1也适用于:
char **strings = (char *[]) {"abc", "bca", "rat", "tar", "far"};
C99草案,6.5.2.5,复合文字
约束
1类型名称应指定对象类型或数组 大小未知,但不是可变长度数组类型。
2初始化程序不应尝试为对象提供值 包含在由化合物指定的整个未命名对象中 文字。
3如果复合文字出现在函数体外,则为 初始化列表应由常量表达式
组成
答案 2 :(得分:1)
1)char **字符串是指针指针的声明,它期望数字的归属而不是字符串数组。
2)尝试在[]:char * strings [5] = {....
中定义大小3)再次定义数组的大小,[x] [y] x =元素数,y =最大元素的字符数