`int(* B)[COLSIZE];`和`int * C [ROWSIZE];`之间的区别?

时间:2014-11-26 08:34:26

标签: c pointers

以下声明之间有什么区别?

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));

据我所知,两者都是声明二维数组的不同方法。但我无法弄清楚两者之间的区别。任何图片说明都将非常感激。

1 个答案:

答案 0 :(得分:3)

B是指向COLSIZE int数组的指针,在此上下文中将其用作数组。它被用于malloc 连续的 ROWSIZE x COLSIZE整数数组。

C是指向ROWSIZE的{​​{1}}指针数组。它被用于malloc int x ROWSIZE COLSIZE个数组,但行连续 - 每行实际上是一个单独的1D数组。< / p>

在任何一种情况下,元素都可以作为intB[i][j]来处理,但是底层数据组织是不同的。

当您访问C[i][j]时,会执行简单的索引计算(&#34;展平&#34;索引为B[i][j])。

当您访问i * COLSIZE + j时,首先加载指针C[i][j]作为行C[i]的基地址,然后通过添加找到此行的i元素将j偏移到此基址。