arr2d[2][4] 질문 있습니다
320
작성한 질문수 4
float arr2d[2][4]; 가 있을 때 arr2d의 사이즈 자체는 32바이트이지만 arr2d는 메모리공간은 없는 float 4개짜리 배열의 포인터잖아요.
제가 잘못 배운 게 아니라면 뭔가 괴리감이 크게 느껴집니다. 그냥 받아들일까요?
답변 1
1
안녕하세요, 답변 도우미 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
그럼, 제가 이해한 게 맞나요?
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 입니다.
네, 옳게 이해하신 것 같습니다.arr2d 는 메모리 공간을 갖는 2차원 배열입니다. 다만, 배열의 이름 그 자체가 포인터와 호환이 되는 형태로 사용될 때에는, 주소를 저장할 수 있는 별도의 메모리 공간을 가지고 있지는 않은 일종의 식별자로 생각하시는 것이 적절할 것 같습니다.
추가 질문 ) "pa = arr2d; 이때 arr2d(배열명)은 float 자료형 4 개의 배열의 포인터와 호환이 되는 형태인 것도 틀렸나요?"
: 아니요, 틀리지 않으셨습니다.
만약, arr2d 가 float 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





