• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

23.08.13 17:13 작성 조회수 241

1

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

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

답변 1

답변을 작성해보세요.

1

Soobak님의 프로필

Soobak

2023.08.13

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

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

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

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

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

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

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

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

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 *' 이렇게 나오지 않을까 싶습니다.

Soobak님의 프로필

Soobak

2023.08.13

안녕하세요, 답변 도우미 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] 는 자료형 불일치 경고가 발생할 것입니다.

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