들어가기 앞서
아래의 소스를 읽기만 하고 넘어가겠습니다.
main() { int i, j; int mozi[2][2] = { {0, 0}, {1, 1} }; int (*tistory)[2]; tistory = mozi; for(i=0; i<2; i++){ for(j=0; j<2; j++){ printf("%d\n", *(*(tistory + i) + j)); // 포인터 연산만 이용한 계산
printf("%d\n", *(tistory[i] + j)); // 부분 첨자를 이용한 계산
printf("%d\n", tistory[i][j]); // 첨자를 이용한 계산
printf("%d\n", mozi[i][j]); // 비열을 이용한 계산
}
} }
2차원 배열과 포인터
int *tistory; 라면 mozi 는 1차원 배열이어야 하므로 맞지 않습니다.
int **tistory; 라면 1차원 포인터 배열에 대한 변수이므로 이 역시 맞지 않습니다.
** 는 나중에 다루기로 하고 2차원 포인터는 어떻게 연결시켜야 할까요?
int *tistory; // 1차원 배열 포인터 int *(tistory)[2] // 2차원 배열 포인터
int *(tistory)[2][2] // 3차원 배열 포인터
*(tistory)[2] 와 *tistory[2] 는 어떻게 다를까? 는 포스팅 하단에서 다루겠습니다.
할당된 메모리는 3개의 변수 모두 4 바이트만 할당되며 주소 값을 지정할 수 있습니다.
1차원 배열 포인트는 4바이트가 할당, 2차원 배열 포인터는 8바이트가 할당이 아닙니다.
포인터변수 이므로 무조건 4바이트가 할당이며, 단지 가리키는 대상체의 차원에 따라 정의하는 형식만 달라집니다.
2차원 배열과 2차원 배열 포인터를 연결하는 방법입니다.
int mozi[2][2]; int *(tistory)[2]; tistory = mozi;
만약 ( ) 를 안붙이고 아래처럼 하면 어떻게 될까요?
컴파일 자체가 되지 않습니다. 두 개의 차이점을 그림으로 비교해보겠습니다.
int mozi[2][2];
int *tistory[2]; tistory = mozi;
위의 *(tistory)[2] 는 2차원배열 포인터 변수를 정의한 포인터 주소를 담을 수 있는 4바이트만 할당됩니다.
반면 *tistory[2] 는 4바이트 주소를 담을수 있는 포인터주소 공간이 2개 즉 8바이트가 할당됩니다.
각 변수들이 메모리에 할당된 크기를 알아봅니다.
int mozi[2][2];
int (*tistory)[2]; sizeof(mozi); sizeof(tistory); sizeof(*tistory);
mozi : mozi[2][2] 를 대표하는 모 배열입니다. 따라서 [0][0] ~ [2][2] 까지 할당된 모든 메모리 영역에 대한 크기가 출력됩니다.
tistory : 포인터변수이므로 무조건 4 라는 수치가 출력됩니다.
*tistory : tistory 가 가리키는 대상체를 뜻합니다. 첨자에 사용된 2라는 수치가 대상체의 개수([0][0], [0][1])를 나타내므로 4 * 2 = 8 이 출력됩니다.
2차원 포인터 다루기
배열과 포인트의 매칭으로 설명을 대체하겠습니다.
int mozi[2][2] = {{3, 5}, {12, 54}};
int (*tistory)[2]; tistory // mozi tistory + 1 // mozi + 1 tistory + 2 // mozi + 2 *tistory // mozi[0] *(tistory + 1) // mozi[1] *(tistory + 2) // mozi[2] **tistory // mozi[0][0] 선언의 ** 와 사용의 ** 을 착각하시면 안됩니다. *(*tistory + 1) // mozi[0][1] *(*(tistory + 1)) // mozi[1][0] *(*(tistory + 1) + 1) // mozi [1][1]
배열 포인터에서 별표는 배열에서 대괄호를 이용한 첨자들을 사용한 것과 같습니다.
'Computer Language > C' 카테고리의 다른 글
[C] 문자열과 포인터 사용법 알아보기 (0) | 2018.11.20 |
---|---|
[C] 1차원 배열과 포인터 학습하기 (0) | 2018.11.18 |
[C] 포인터란 무엇인가? (0) | 2018.11.16 |
[C] 스택 개념, 함수, 코드 정리 (0) | 2018.11.08 |
[C] 큐 개념, 종류 및 작동 방식, 코드 정리 (0) | 2018.11.08 |