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 와 같이 더블포인터로 주소를 담을순 있지만 배열에 접근이 어렵습니다. 보통 포인터 배열을 가리키는 용도로 사용합니다.

    지금 강의를 적을 수는 없고 잘 정리해둔 주소를 대신 첨부합니다.

    https://noname2.tistory.com/102

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)