This question already has answers here:
Pointer to an array and Array of pointers

(6个答案)


5年前关闭。




以下声明之间有什么区别?
int (*B)[COLSIZE];
int *C[ROWSIZE];

B = (int (*)[COLSIZE])malloc(ROWSIZE * sizeof(int[COLSIZE]));
for (int i=0; i < ROWSIZE; ++i)
    C[i] = (int *)malloc(COLSIZE * sizeof(int));

我知道这两种声明二维数组的方式都是不同的。但是我无法弄清楚两者之间的区别。任何图片说明将不胜感激。

最佳答案

B是指向COLSIZE数组int的指针,在此上下文中将其用作数组。它用于malloc x ROWSIZE int的连续数组。
COLSIZE是指向CROWSIZE指针的数组。它用于分配intROWSIZE x COLSIZE数组,但是行并不连续-每行实际上是一个单独的1D数组。

无论哪种情况,元素都可以寻址为intB[i][j],但是底层数据的组织不同。

当您访问C[i][j]时,将执行简单的索引计算(“扁平化”索引为B[i][j])。

当您访问i * COLSIZE + j时,首先将指针C[i][j]加载为C[i]行的基地址,然后通过向该基地址添加偏移量i来定位该行的j th元素。

10-05 19:49