3

这些是用于二维数组的符号

char (*names)[5] ;

char* names[] = {"Jan","Feb"};

char names[3][5] = { Initializers..};

我对这些符号感到非常困惑。

第一个声明名称是指向 5 个字符数组的指针,即

names -> a char pointer -> "Some string"

第三个有不同的内存映射,即它像普通数组一样以行主要顺序存储,与上述不同。

第 2 记法与第 1 和第 3 记法有何相似或不同?

将它们传递给函数也是完全不同的故事。如果我们将二维数组声明为类型 2,则它作为双指针 ( char** names) 传递,而如果它是类型 1 或类型 3,则应在声明中提及列。

请帮助我更清楚地了解这些问题。谢谢。

4

1 回答 1

6

这些示例中只有一个是二维数组:

char names[3][5];

其他的不一样:

char (*names)[5] ;

是指向一维数组的指针,并且:

char* names[] = {"Jan","Feb"};

是一维指针数组。

我现在要重命名它们以更清楚:

char a[3][5];
char (*b)[5];
char *c[3];

a是唯一真正的二维数组。也就是说,它占用了连续的内存并且有空间容纳三个字符串,每个字符串长度为 5 个字符(包括空终止符)。

b是指向数组的指针;不包括该数组的任何潜在内容的存储。

c是一个指针数组,每个指针都可以用来指向你碰巧关心的任何字符串;没有为任何字符串本身保留存储空间,只为三个指针保留。

如果您有一个带有原型的函数,例如:

void myfunction(char **p);

只能c传递给这个函数;其他人不会按照你希望他们的方式行事。

于 2013-08-20T19:36:01.697 回答