inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.14 2차원 배열과 포인터

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

해결된 질문

865

asdfaa22

작성한 질문수 15

0

안녕하세요, 항상 답변 감사드립니다.

4:47 쯤에 2차원 배열은 역참조를 2번해서 이중포인터 처럼 

사용할 수 있다고 말씀하셨는데,

실제로 2차원 배열은 이중 포인터는 아닌거죠?

c

답변 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

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

0

asdfaa22

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

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

48

3

main 함수에서 왜 int만 선언이 되는걸까요

1

53

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

53

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

46

1

프로토타입과 함수간의 인자 불일치

1

72

2

12.12 헤더 관련 질문

1

59

2

Visual Studio Community 2026 사용 문의

1

135

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

59

2

getchar(), putchar()

1

92

3

강의자리ㅛ

1

78

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

74

2

F5와 F7의 차이

1

75

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

52

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

64

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2

11.5 코드 구현

1

67

2