작성
·
284
1
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차원 배열이며, 그 이름은 배열의 시작 주소를 나타내는 일종의 '포인터와 호환이 되는 형태' 인 것입니다.
안녕하세요, 답변 도우미 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]
는 자료형 불일치 경고가 발생할 것입니다.
요약하면, 가리키는 주소의 값은 동일하지만 각각의 자료형은 다르다고 말씀드리는 것이 적절할 것 같습니다
나머지 내용들에 대해서는 옳게 이해하신 것 같습니다. 👍👍
그럼, 제가 이해한 게 맞나요?
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 *' 이렇게 나오지 않을까 싶습니다.