인프런 커뮤니티 질문&답변

asdfaa22님의 프로필 이미지
asdfaa22

작성한 질문수

홍정모의 따라하며 배우는 C언어

10.14 2차원 배열과 포인터

[4:47]2차원 배열과 이중 포인터

해결된 질문

작성

·

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

asdfaa22님의 프로필 이미지
asdfaa22
질문자

감사합니다! 단번에 이해가 되었습니다~!

0

asdfaa22님의 프로필 이미지
asdfaa22
질문자

넒은의미로 알려주신 의미에 대해서는 이해가 되었습니다! 하지만 문법적인 관점에서 매개변수로 이중포인터를 받는 함수의 인자로는 2차원배열을 사용할 수 없는거죠?

asdfaa22님의 프로필 이미지
asdfaa22

작성한 질문수

질문하기