我知道,静态数组在内存中是连续排列的。例如,int T[10][10]
基本上与int T[100]
存储方式相同。我可以通过多种方式访问索引为i,j的元素,例如:
int T[10][10];
/*filling array*/
int i=3, j=7;
int x = T[i][j];
//EDIT - old and wrong: int * ptr = T;
int * ptr = &T[0][0];
int y = *(ptr + 10* i + j);
另一方面,当我自己创建动态分配的二维数组时:
int ** T;
T = malloc(10 * sizeof(int *));
for(i = 0; i < N; i++)
T[i] = malloc(10 * sizeof(int));
我的数组包含指针
显然,我可以通过以下方式访问这个数组的元素:
int i=3, j=7;
int x = *(*(T+i)+j);
现在我的问题是:为什么静态数组可以工作,它是如何工作的? 为什么?
int T[10][10];
/*filling array*/
int i=3, j=7;
int x = *(*(T+i)+j);
当这个表不包含指向数组的指针时,如何将好的值返回给x
?在我看来,*(*(T+i))
在那里没有意义,即使有,它也应该返回T[0][i]
,因为T指向数组的第一个元素。编译器如何解释这个问题,*
在这里是否是其他的东西而不是解引用?请给我解释一下。
int **
不是一个二维数组,不能指向一个二维数组,也不能代表一个二维数组。T[i][j]
和*(*(T+i)+j)
是完全相同的(根据[]
运算符的定义)。 - Martin Bonner supports Monica*((int*)T + i*s + j)
- 强制转换是必需的,因为T会衰减为“指向包含10个整数的数组的指针” - 并且偏移量将全错)。 - Martin Bonner supports Monica