This question already has answers here:
Pointer to an array and Array of pointers
(6个答案)
5年前关闭。
以下声明之间有什么区别?
我知道这两种声明二维数组的方式都是不同的。但是我无法弄清楚两者之间的区别。任何图片说明将不胜感激。
(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
是指向C
的ROWSIZE
指针的数组。它用于分配int
的ROWSIZE
x COLSIZE
数组,但是行并不连续-每行实际上是一个单独的1D数组。
无论哪种情况,元素都可以寻址为int
或B[i][j]
,但是底层数据的组织不同。
当您访问C[i][j]
时,将执行简单的索引计算(“扁平化”索引为B[i][j]
)。
当您访问i * COLSIZE + j
时,首先将指针C[i][j]
加载为C[i]
行的基地址,然后通过向该基地址添加偏移量i
来定位该行的j
th元素。
10-05 19:49