[4:47]2차원 배열과 이중 포인터
안녕하세요, 항상 답변 감사드립니다.
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차원 배열들의 배열이므로 포인터의 포인터로 해석할 수도 있을 것 같단 생각이 듭니다.
강의에선 이중포인터처럼 ** 두개 사용하여 역참조 할 수 있기 때문에 그런 의미에서 이중포인터처럼 사용할 수 있다고 말씀해주신 것 같아요.
완전히 똑같이 따라해도 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





