2014-11-26 1 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)); 

2 차원 배열을 선언하는 두 가지 방법이 서로 다릅니다. 그러나 나는이 둘의 차이점을 이해할 수 없다. 모든 그림 설명은 매우 감사하겠습니다.

+3

C 선언을 이해하는 데 어려움이 있으면 http://cdecl.org를 사용해보십시오. –

+1

@PaulR +1 그게 유용한 링크입니다! – Sabuncu

+0

앤드류 코닉 (Andrew Koenig)이 고전적으로 저에게 매우 도움이 된 클래식 종이를 강력히 추천합니다 : http://www.literateprogramming.com/ctraps.pdf – Sabuncu

답변

3

B은이 문맥에서 배열로 사용되는 COLSIZEint의 배열에 대한 포인터입니다. 그것은 malloc인접한 배열 ROWSIZE x COLSIZE ints에 사용되었습니다.

C은 의 포인터이고, 배열은 int입니다. ROWSIZE x COLSIZE 배열이 int s인데, 행은 이 아니고 연속적입니다. 각 행은 실제로 개별 1D 배열입니다.

두 경우 모두 요소는 B[i][j] 또는 C[i][j]으로 처리 할 수 ​​있지만 데이터 부족 조직은 다릅니다.

B[i][j]에 액세스하면 간단한 색인 계산이 수행됩니다 ("병합 된"색인은 i * COLSIZE + j입니다).

는 포인터 C[i] 먼저 행 i 기본 주소로로드하고,이 행의 j th 요소가이 기본 주소 j 오프셋 가산함으로써 위치 C[i][j] 액세스

.

관련 문제