假设我有一个二维数组grid
声明为double grid[5][5]
.我的理解是,以下陈述是正确的:
grid
声明时,为5*5双精度分配一个连续的内存块,不多也不少;grid[i][j]
,这段代码实际上被解释为*(grid+(i*5+j))
.另一方面,我知道我也可以存储与指针数组相同的矩阵,类似于:
double ** grid;
grid = (double**)malloc(sizeof(double*)*5);
for (i=0; i<5; i++)
grid[i] = (double*)malloc(sizeof(double)*5);
Run Code Online (Sandbox Code Playgroud)
我实际上有一个代码可以做到这一点.问题是,然后它继续grid
使用双下标符号来访问前面的元素.这种情况有所不同吗?在这种情况下,grid[i][j]
转换为*(*(grid+i)+j)
,即双重解除?这是我能看到它正确发生的唯一方式.
(这个问题可能源于我(缺乏)对C中指针和数组类型之间关系的理解...)
编辑:
好吧,让我们看看我是否直截了当:
grid[i][j]
总是被转换成*(*(grid+i)+j)
;*( (double*)grid + (i*5+j) )
,这是可能的,因为编译器知道任何grid[i]
实际上是从位置开始的数组grid+i*5
.但这给我留下了一个不可避免的结论:对于2D数组,如果我设置i=j=0
,那么我就有了**grid == *((double*)grid)
.它是否正确?