C언어 2차원배열 + 포인터 배열 선언 방법이 궁금합니다 !
조회수 1066회
int arr[2][3] = { {1,2,3},{4,5,6} };
int(*parr)[3];
parr = arr;
위 코드에서 int (*parr)[3];
의 의미를 잘 모르겠네요.
첫 줄에서 선언된 arr 배열이 2행 3열로 구성되어있는데
(*parr)[3]은 각 행의 첫 요소의 주소값을 가지는거 아닌가요?
(주소는 16진수로 출력) - 실행 결과 보시는 바와 같이 parr[0]는 parr[0][0], parr[1]은 parr[1][0] 서로 같은 주소를 가지는 것을 확인 할 수 있습니다. 하지만 parr[2]는 제가 생성하지 않은 arr[1][2] 이후의 주소를 가지고 있으며 그 주소에 가진 값을 확인했을 때 초기화 되지 않은 값이 나오는 걸 확인했습니다. 하지만 int (*parr)[2];
라고 선언 할 경우 컴파일 에러가 나옵니다. c언어에 대한 이해도가 크게 높지 않으니 고수님들 자세한 설명 부탁드리겠습니다 ㅠㅠ 상당히 난해하네요. 감사합니다 !!!
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
int(*parr)[3];
은 2차원 배열을 가리키는 포인터 입니다.parr = arr;
은 2*3 배열을 가리키게 됩니다.아래와 같이 포인터로 arr 에 접근 할 수 있습니다.
[cling]$ parr[0] (int [3]) { 1, 2, 3 } [cling]$ parr[1] (int [3]) { 4, 5, 6 }
그리고 parr[2] 는 arr 의 2*3 의 범위를 넘어서니 올바르지 않은 값이 나올겁니다. 쓰레기값이 나온다거나...등등
int (*parr)[2];
는 선언까지는 문제 없지만parr = arr;
에서 문법에러입니다. 배열이 2*3 이므로 3개의 공간이 필요합니다. 즉 3개 요소를 담는 배열들을 담는 포인터입니다.int **pa = (int**)arr
와 같이 더블포인터로 주소를 담을순 있지만 배열에 접근이 어렵습니다. 보통 포인터 배열을 가리키는 용도로 사용합니다.지금 강의를 적을 수는 없고 잘 정리해둔 주소를 대신 첨부합니다.
댓글 입력