2014-11-26 2 views
3

В чем разница между следующими объявлениями?Разница между `int (* B) [COLSIZE];` и `int * C [ROWSIZE];`?

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

Я понимаю, что оба варианта - это разные способы объявить двухмерный массив. Но я не могу понять разницу между ними. Любое иллюстративное объяснение будет высоко оценено.

+3

Если у вас возникли трудности с пониманием декларации C, попробуйте использовать http://cdecl.org. –

+1

@PaulR +1 Это одна полезная ссылка! – Sabuncu

+0

Я очень рекомендую классическую статью Эндрю Кенига, которая очень помогла мне в прошлом: http://www.literateprogramming.com/ctraps.pdf – Sabuncu

ответ

3

B является указателем на массив COLSIZEint s, который в этом контексте используется как массив. Он используется для malloc a смежный массив ROWSIZE x COLSIZE ints.

C - массив из ROWSIZE указателей на int. Он используется для malloc ROWSIZE x COLSIZE массив из int s, но строки не смежные - каждая строка на самом деле является отдельным массивом 1D.

В любом случае элементы могут быть адресованы как B[i][j] или C[i][j], но организация данных подлеубежей отличается.

При достижении B[i][j] выполняется простой расчет индекса (индекс «сплющенный» равен i * COLSIZE + j).

При доступе C[i][j] указатель C[i] сначала загружаются в качестве базового адреса для ряда i, а затем j й элемент этой строки находится путем добавления смещения j к этому базовому адресу.

Смежные вопросы