해결된 질문
작성
·
689
0
안녕하세요, 항상 답변 감사드립니다.
4:47 쯤에 2차원 배열은 역참조를 2번해서 이중포인터 처럼
사용할 수 있다고 말씀하셨는데,
실제로 2차원 배열은 이중 포인터는 아닌거죠?
답변 4
3
네 맞습니다. 문법적으로 오류가 나진 않는데 이중 포인터를 이차원 배열처럼 사용하려고 하시면 런타임 에러가 나실겁니다!
이중 포인터 ptr1 에 a의 주소를 대입했더니 잘 대입이 되었습니다.
그러나 ptr1에 a가 "3길이의 1차원 배열"을 2개 가진 배열이라는 정보는 ptr1에 넘겨지지 못하고 a의 첫번째 원소 주소만 달랑 넘어가져서인지 ptr1[4]는 마치 {1,2,3,4,5,6} 일차원 배열의 인덱스4 원소를 출력하는 것 같이 5를 출력한 것에 반해 (이차원 배열도 메모리에 1차원 적으로 일렬로 저장이 되죠. 그래서 이게 가능했던듯 합니다.) ptr1[0][2] 는 런타임 에러가 발생했습니다. ptr1은 a 가 담고 있는 데이터(첫번째 원소의 주소값)을 넘겨 받긴 했지만 a가 3길이의 1차원 배열을 원소로 하는 배열이라는 정보는 ptr이 알 수 없었기 때문에 ptr1[0][2] 는 불가능했던게 아닌가 싶습니다.
이렇게 int(*)[3] 타입의 포인터로 a의 주소를 받았을 땐 ptr2로도 이차원 배열 역할을 할 수 있는 것을 확인할 수 있습니다. 이 타입으로 인해 a에게서 "3 길이의 배열"을 2 개 가진 배열이라는 정보를 받을 수 있었던게 아닌가 싶습니다. 따라서 ptr2[0]엔 이차원 배열 a의 첫번째 배열인 {1,2,3}의 주소가 담기게 되고 ptr2[0][2]는 무사히 {1.2.3}의 인덱스2 에 해당하는 3을 잘 출력한 것을 확인할 수 있습니다.
여담으로 C++에선 이중포인터는 아예 이차원 정적 배열을 참조할 수 없도록 문법적으로도 막혀있습니다. (위는 main.cpp 코드입니다)
1
안녕하세요.
마지막에 말씀하신 그 이중 포인터의 의미가, 문법적인 의미에서의 int ** 로 선언하는 그 포인터를 말씀하시는 것이라면
'정적' 2차원 배열에서는 아닙니다. 예를 들어 int a[2][3] 라는 이차원 배열이 있다면 a의 타입은 int **가 아닌 int (*)[3] 입니다. (3길이를 가진 1차원 int 배열들이 모인 배열을 가리키는 포인터라는 뜻)
int ** 문법적 의미를 가리키는 것이 아닌, 넓게 해석하는 의미에선 2차원 배열도 이중 포인터라고 말할 수 있을 것 같아요. 2차원 배열은 1차원 배열들의 배열이므로 포인터의 포인터로 해석할 수도 있을 것 같단 생각이 듭니다.
강의에선 이중포인터처럼 ** 두개 사용하여 역참조 할 수 있기 때문에 그런 의미에서 이중포인터처럼 사용할 수 있다고 말씀해주신 것 같아요.
0
0