공부한지 한참되었는데도
개념부터 매번 흔들흔들 답답하네요....
질문 하나 드리고싶습니다.
일단 저는 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);
이런식으로 확인을 해보았지만
결과는 두주소값이 동일했습니다...
같은 주소를 쏴주는데 대체왜...
개념좀 튼튼하게 잡아줄 선배님들의 조언 부탁드립니다......