2D阵列中的不同指针表示法?

Hoo*_*oli 3 c pointers multidimensional-array

这些是用于2D阵列的符号

char (*names)[5] ;
Run Code Online (Sandbox Code Playgroud)

char* names[] = {"Jan","Feb"};
Run Code Online (Sandbox Code Playgroud)

char names[3][5] = { Initializers..};
Run Code Online (Sandbox Code Playgroud)

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

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

names -> a char pointer -> "Some string"
Run Code Online (Sandbox Code Playgroud)

第三个存储器映射具有不同的存储器映射,即它与行正常数组一样以行主要顺序存储,与上述不同.

第二种符号与第一种和第三种符号的相似或不同如何?

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

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

Car*_*rum 6

这些示例中只有一个是2D数组:

char names[3][5];
Run Code Online (Sandbox Code Playgroud)

其他是不同的:

char (*names)[5] ;
Run Code Online (Sandbox Code Playgroud)

是指向1D数组的指针,并且:

char* names[] = {"Jan","Feb"};
Run Code Online (Sandbox Code Playgroud)

是一维指针数组.

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

char a[3][5];
char (*b)[5];
char *c[3];
Run Code Online (Sandbox Code Playgroud)

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

b是一个指向数组的指针; 不包括该阵列的任何潜在内容的存储.

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

如果你有一个原型的功能,如:

void myfunction(char **p);
Run Code Online (Sandbox Code Playgroud)

只能c传递给这个函数; 其他人不会按照你喜欢的方式行事.

  • 另外,`b`指向的5`cog`数组可能是5`char`数组数组的元素,因此它用于访问二维数组.`b = a`是一项法律任务. (3认同)