C language 2d array ptr vs integer
C
int *ptr[10]; #1
int ptr2[10]; #2
int ptr3[10][10]; #3
ptr[idx][w_idx] = value;
ptr2[idx][w_idx] = value;
ptr3[idx][w_idx] = value;자 위에 코드를 보고 차이점을 알 수 있겠는가? 아마 상당히 헷갈릴 것이다. 함께 알아가보도록 하자
1번 int *ptr[10];
일단 int 형 포인터 배열이다. 알다시피 이 배열에는 주소 ( 8바이트 or 4바이트 , 운영체제에 따라 ) 가 담기게 설계가 되어있다.
따라서 ptr[idx]의 값은 주소를 나타내는데 ptr[idx][w_idx] 은 그럼 ptr[idx]의 값이 주소이므로 ptr[idx]의 값부터 ( 주소 ) 시작하는 배열의 w_idx 번째 요소라고 볼 수 있다.
좀 더 쉽게 바라보면 일반적으로 A[10] 이라고 할때 A는 어느 주소를 의미한다. A[0]은 *A 와 같고 A[1] 은 *(A + 1) 와 같다. 따라서 ptr[idx][w_idx] 여기서 ptr[idx] 역시 어느 주소를 의미하므로 A[w_idx] 와 같은 형태이다.
2번 int ptr2[10];
이건 단순히 정수형 배열이다.
따라서 ptr2[idx][w_idx] = value; 이렇게 쓰면 컴파일 에러가 일어난다.
3번 int ptr3[10][10];
자 이제 선언을 처음 부터 2차원으로 해줬는데 이를 보면 ptr3[10] 이 정수형 배열이 있는데 이 배열의 배열을 의미하게 된다.
좀더 쉽게 풀자면, int a[ROWS][COLS]; 이 형태는 “COLS개의 int로 이루어진 배열을 ROWS개 가진 배열” 첫 번째 차원의 각 원소의 타입 자체가 int [COLS](배열) 이라는 말이다.
*((int *)a + COLS * i + j) = value; 주소 계산은 다음과 같이 된다.