inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.14 2차원 배열과 포인터

arr2d[2][4] 질문 있습니다

320

donghun Kang

작성한 질문수 4

1

float arr2d[2][4]; 가 있을 때 arr2d의 사이즈 자체는 32바이트이지만 arr2d는 메모리공간은 없는 float 4개짜리 배열의 포인터잖아요.

제가 잘못 배운 게 아니라면 뭔가 괴리감이 크게 느껴집니다. 그냥 받아들일까요?

c

답변 1

1

Soobak

안녕하세요, 답변 도우미 Soobak 입니다.

아닙니다. 오해하고 계신 부분에 대해서 말씀드리겠습니다.

"arr2d 가 메모리 공간은 없는 float 자료형 4 개의 배열의 포인터" 는 옳지 않습니다.

arr2d실제로 메모리 공간을 가진 2차원 배열 입니다.
배열의 이름 arr2d 는 배열의 첫 번째 요소의 주소, 즉 arr2d[0][0] 의 주소이자, arr2d[0] 의 시작 주소를 나타내기도 합니다.

하지만, 그렇다고 해서 arr2d 가 배열에 대한 포인터라는 것은 아닙니다.
'배열의 이름은 포인터와 호환이 되는 형태' 로 이해하시는 것이 옳습니다. (강의 10.4 포인터와 배열3:30 부분 참조)

실제로, sizeof(arr2d) 를 통해 직접 arr2d 의 사이즈를 측정해보시면, 크기가 32 바이트 라는 것을 확인하실 수 있습니다.

요약하면, arr2d 는 실제로 32 바이트 크기의 메모리 공간을 가지는 2차원 배열이며, 그 이름은 배열의 시작 주소를 나타내는 일종의 '포인터와 호환이 되는 형태' 인 것입니다.

1

donghun Kang

그럼, 제가 이해한 게 맞나요?

arr2d 자체는 메모리 공간을 갖지만 배열명은 주소를 가리킬 뿐, 주소를 저장할 수 있는 별도의 메모리공간이 존재하지 않는다

또 궁금한 게 생겼습니다.

float (*pa)[4];

pa = arr2d; 이때 arr2d(배열명)은 float 자료형 4 개의 배열의 포인터와 호환이 되는 형태인 것도 틀렸나요?

배열명 arr2d가 arr2d[0][0]의 주소를 가리키는 거면 pa = &arr2d[0][0];처럼

warning C4047: '=': 'float (*)[4]' differs in levels of indirection from 'float *' 이렇게 나오지 않을까 싶습니다.

0

Soobak

안녕하세요, 답변 도우미 Soobak 입니다.

네, 옳게 이해하신 것 같습니다.
arr2d 는 메모리 공간을 갖는 2차원 배열입니다. 다만, 배열의 이름 그 자체가 포인터와 호환이 되는 형태로 사용될 때에는, 주소를 저장할 수 있는 별도의 메모리 공간을 가지고 있지는 않은 일종의 식별자로 생각하시는 것이 적절할 것 같습니다.

추가 질문 ) "pa = arr2d; 이때 arr2d(배열명)은 float 자료형 4 개의 배열의 포인터와 호환이 되는 형태인 것도 틀렸나요?"
: 아니요, 틀리지 않으셨습니다.
만약, arr2dfloat arr2d[x][4]; 와 같이 선언되었다고 가정해보겠습니다.
여기서 arr2d 는 첫 번째 행의 주소를 가리키기도 합니다. (해당 강의4:00 부분 경 참조)
따라서, 그 주소는 float[4] 자료형의 배열을 가리키므로, arr2d 의 자료형은 float (*)[4] 가 될 것입니다. 이를 pa 에 할당하는 것은 가능합니다.

float (*pa)[4];
pa = arr2d; // 가능!

따라서, "pa = arr2d; 에서 arr2d(배열명) 은 float 자료형 4 개의 포인터와 호환이 되는 형태" 라고 말씀하신 것은 옳습니다.

다만, 이전의 답변에서 혼동을 드릴 수 있는 부분을 말씀드린 것 같아서 부연 설명을 드립니다.
해당 강의의 4:00 부분의 자료화면을 참고해보시면,
arr2d == arr[0] == &arr[0] == &arr[0][0] 으로 각각이 '가리키는 주소 값' 이 모두 동일합니다.

하지만, 자료형에 있어서는 차이가 있습니다.
예를들어, arr[0]float (*)[4] 자료형이며, &arr[0][0]float * 자료형입니다.
따라서, 모두 가리키는 주소는 같지만, 각각의 자료형이 같은 것은 아닙니다.
즉, 말씀하신대로 pa = &arr2d[0][0] 는 자료형 불일치 경고가 발생할 것입니다.

요약하면, 가리키는 주소의 값은 동일하지만 각각의 자료형은 다르다고 말씀드리는 것이 적절할 것 같습니다
나머지 내용들에 대해서는 옳게 이해하신 것 같습니다. 👍👍

Export template 안됨

1

23

2

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

1

55

3

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

1

56

2

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

1

54

2

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

1

49

1

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

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

138

2

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

1

61

2

getchar(), putchar()

1

93

3

강의자리ㅛ

1

80

2

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

1

114

2

소스파일안에 여러 파일

1

76

2

F5와 F7의 차이

1

77

2

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

1

58

2

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

1

70

1

Step over 기능 문의

1

53

2

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

1

76

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

61

2

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

1

62

2

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

1

65

2

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

1

53

2

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

1

54

2