게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
2차원 배열과 포인터 질문입니다.
게시물ID : programmer_13879짧은주소 복사하기
작성자 : 감감무소식
추천 : 0
조회수 : 449회
댓글수 : 5개
등록시간 : 2015/10/15 01:04:42
공부한지 한참되었는데도

개념부터 매번 흔들흔들 답답하네요....

질문 하나 드리고싶습니다.

일단 저는 main문에서 선언된 2차원 배열을 더블 포인터로 받아서 참조를 하고싶어 실험을 하였습니다.

예를들면
int mat[3][3] = { 1,2,3,4,5,6,7,8,9 };
int **ptr_mat;

ptr_mat = mat;

물론 이것은 mat가 int (*)[3]형 변수이다 보니까 컴파일 오류가 나더군요... 그래서 캐스팅을 하여 넣었습니다.
따라서 
ptr_mat = (int**) mat;
이렇게 되겠고 출력을 하였습니다.
for(int i = 0; i < 3; i++) {
for (int j = 0 ; j < 3; j++) {
printf("%d", ptr_mat[i][j]);
}}

결과는 물론 잘나오더군요..

이제 한발자국 더나아갑니다.


그럼 이런식으로 캐스팅한 2중 포인터로 다른 함수로 쏴서 보내주어보는 실험을 합니다.
여기서부터는 일일이 설명드리기 힘드니 코드를 전부 붙여넣겠습니다.

#include < stdio.h>

void aa(int **p)
{
printf("%d", **p);
}

void main()
{
int a[2][2] = { 1, 2, 3, 5 };
int**ptr_a;
aa((int **)a);
}
}


하지만 이렇게 이중 포인터로 다른 함수로 쏴준 경우엔 컴파일은 되지만 실행이 되지 않습니다.

사실 어떤것이 맞는 답인지는 알고있습니다.
#include < stdio.h>


void aa(int (*p)[2])
{
printf("%d", **p);
}



void main()
{
int a[2][2] = { 1, 2, 3, 5 };
int (*ptr_a)[2];
aa(a);
}
이런식이 되겠지요....첫번째 경우에서 캐스팅후에 함수가 넘겨 받는 값도 &a[0]일테고 올바른경우에서 함수 aa 의 인자 a가 가르키는 값이 &a[0]일텐데....왜 하나는 오류가 나고 하나는 실행이 되는지 너무 궁금합니다.

혹시나 (int**)a가 가르키는 주소와 a가 가르키는 주소가 다를까봐
printf("%d \n", (int**)a);
printf("%d \n", a);
이런식으로 확인을 해보았지만

결과는 두주소값이 동일했습니다...
같은 주소를 쏴주는데 대체왜...

개념좀 튼튼하게 잡아줄 선배님들의 조언 부탁드립니다......
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호