2D char数组和char **(OR,3D char数组和char ***等)之间的区别

首先,我已经审查了这些:

多维数组如何在内存中格式化?

C中二维数组的内存映射

从那里,已知2D数组 char **不同,但在内存中它们看起来完全相同 。 这听起来很奇怪,所以我研究了以下内容:

#include  char func(char** m) { return m[0][0]; //only works for char**, already discussed in the other SO question } int main() { //char a[4][2]; //a 2D char array int row = 4, col = 2; //char** char** a = malloc(row * sizeof(char*)); int i; for (i = 0; i < row; i++) { a[i] = malloc(col * sizeof(char)); } //checking the output printf(" &a = %u\n", &a); printf(" &a[0] = %u\n", &a[0]); printf("&a[0][0] = %u\n", &a[0][0]); printf(" a = %u\n", a); printf(" a[0] = %u\n", a[0]); //printf(" a[0][0] = %u\n", a[0][0]); //char value in a[0][0], here a garbage value //char m = func(a); //only works for char**, already discussed in the other SO question return 0; } 

char **的可能输出:

  &a = 3209288 // &a &a[0] = 4083720 // &(*(a+0)) = a &a[0][0] = 4083784 // &(*(*(a+0)+0)) = *a a = 4083720 // a a[0] = 4083784 // *(a+0) = *a 

2D char数组的可能输出:

  &a = 3473104 // &a &a[0] = 3473104 // a &a[0][0] = 3473104 // *a a = 3473104 // a a[0] = 3473104 // *a 

很容易理解char **的输出。 但是2D char数组的输出看起来很奇怪,尽管在其他SO问题中进行了讨论。 我无法想到任何数据类型的指针x

x = &x = * x

并且所有3件物品都存在于同一块内存中。 希望我的困惑是可以理解的。 任何人都能解释这个谜吗?

当您使用数组的名称是除&arraysizeof array之外的任何表达式时,此名称将自动转换为指向数组的第一个元素的指针( char [5][10]将转换为char (*)[10] ) 。 该指针的地址将等于整个数组的地址。
所以,“sizeof(char [5] [10])== 50”,没有额外的指针。

 char arr[5][10]; &a = 3473104 // Address of entire array, (char (*)[5][10]) &a[0] = 3473104 // Address of first row, (char (*)[10]) &a[0][0] = 3473104 // Address of first char, (char *) a = 3473104 // "a", (char [5][10]), converted to "&a[0]", (char (*)[10]) a[0] = 3473104 // "a[0]", (char[10]), converted ro "&a[0][0]", (char *)