这些声明之间的区别?
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)无效?
char **strings
是一个指向指针的指针char
。这是一个有效的类型,但你不能像你试图做的那样用数组初始化器来初始化它。
char *strings[]
是指向 的指针数组char
,并且您对它的初始化是有效的。
char strings[][]
是尝试创建一个二维数组,但这是错误的,因为您必须指定除最外面的维度之外的所有维度的大小(最外面的大小可以从初始化程序中推导出来)。所以这将是有效的:
char strings[][4] = {"abc", "bca", "rat", "tar", "far"};
C99 支持复合文字,因此您可以分配数组初始值设定项。所以案例 1 也适用于:
char **strings = (char *[]) {"abc", "bca", "rat", "tar", "far"};
C99 草案,6.5.2.5,复合文字
约束
1 类型名称应指定对象类型或未知大小的数组,但不能指定可变长度数组类型。
2 任何初始化程序都不应尝试为未包含在复合文字指定的整个未命名对象中的对象提供值。
3 如果复合文字出现在函数体之外,则初始化列表应由常量表达式组成
1) char **strings 是一个指向指针的声明,它需要一个数字的属性而不是一个字符串数组。
2) 尝试在 [] 中定义大小: char *strings[5]={....
3) 再次定义数组的大小,[x][y] 其中 x = 元素数和 y = 最大元素的字符数