首先,我已经回顾过这些:
多维数组在内存中是如何格式化的? https://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory
C 中二维数组的内存映射 https://stackoverflow.com/questions/6673719/memory-map-for-a-2d-array-in-c
由此可知,二维数组是不一样作为 char** 但在内存中它们看起来完全一样。这听起来很奇怪,所以我研究了以下内容:
#include <stdio.h>
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
二维字符数组的可能输出:
&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
所有这三件事物理上都驻留在同一个内存块中。希望我的困惑可以理解。谁能解释其中的奥秘吗?