c中的字符串数组声明

时间:2013-10-23 12:48:59

标签: c arrays string pointers

这些声明之间的区别?

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)无效?

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 =最大元素的字符数