以下声明之间有什么区别?
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));
据我所知,两者都是声明二维数组的不同方法。但我无法弄清楚两者之间的区别。任何图片说明都将非常感激。
答案 0 :(得分:3)
B
是指向COLSIZE
int
数组的指针,在此上下文中将其用作数组。它被用于malloc
连续的 ROWSIZE
x COLSIZE
整数数组。
C
是指向ROWSIZE
的{{1}}指针数组。它被用于malloc int
x ROWSIZE
COLSIZE
个数组,但行不连续 - 每行实际上是一个单独的1D数组。< / p>
在任何一种情况下,元素都可以作为int
或B[i][j]
来处理,但是底层数据组织是不同的。
当您访问C[i][j]
时,会执行简单的索引计算(&#34;展平&#34;索引为B[i][j]
)。
当您访问i * COLSIZE + j
时,首先加载指针C[i][j]
作为行C[i]
的基地址,然后通过添加找到此行的i
元素将j
偏移到此基址。