这些是用于2D阵列的符号
char (*names)[5] ;
和
char* names[] = {"Jan","Feb"};
和
char names[3][5] = { Initializers..};
我对这些符号感到非常困惑。
第一个声明名称是指向5个字符数组的指针,即
names -> a char pointer -> "Some string"
第三个存储器映射具有不同的存储器映射,即它与正常数组一样以行主要顺序存储,与上述不同。
第二种符号与第一种和第三种符号的相似或不同如何?
将它们传递给函数完全是另一回事。如果我们声明2d数组是类型2,那么它将作为双指针(char** names
)传递,而如果它是类型1或类型3,则应在声明中提及列。
请帮助我更清楚地了解这些问题。 感谢。
答案 0 :(得分:6)
这些示例中只有一个是2D数组:
char names[3][5];
其他人不同:
char (*names)[5] ;
是指向1D数组的指针,并且:
char* names[] = {"Jan","Feb"};
是一维指针数组。
我现在要将它们重命名为更清楚:
char a[3][5];
char (*b)[5];
char *c[3];
a
是唯一真正的二维数组。也就是说,它占用了连续的内存,并且有三个字符串的空间,每个字符串长5个字符(包括空终止符)。
b
是指向数组的指针;不包含该阵列任何潜在内容的存储空间。
c
是一个指针数组,每个指针都可用于指向您碰巧关心的任何字符串;没有为任何字符串本身保留存储空间,仅用于三个指针。
如果你有一个原型的功能,如:
void myfunction(char **p);
只能将c
传递给此函数;其他人不会按照你喜欢的方式行事。