인프런 커뮤니티 질문&답변

이시현님의 프로필 이미지

작성한 질문수

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

10.5 2차원 배열과 메모리

ptr[k]는 *(redirection)의미를 내포하고 있는것인가요 ?

해결된 질문

작성

·

164

8

교수님 오랜만에 질문남깁니다. 바쁘시다면 맨 아래 질문을 요약해 두었습니다.

int main()

{

       int arr[2][3] = { {1,2,3}, {4,5,6} };

        int* ptr = &arr[0][0];

for (int k = 0; k < 6; ++k)

printf("%d ", ptr[k]);

printf("\n\n");

printf("%zd %zd\n", sizeof(arr), sizeof(arr[0]));

printf("\n");

}

8분대에 위 코드를 설명해주실 때 ptr[k]를 보면서 ptr앞에 *가 없으니 주소가 출력되겠구나 생각하고 있었는데, 1,2,3,4,5,6이 출력되어서 혼동이 왔습니다. 

int *ptr = &arr[0][0]으로 ptr은 arr의 메모리 주소를 가지고 있고 ptr[k]에서 *를 달아주지 않았음에도 arr의 배열Value를 출력시키고 있는것은 ptr[k]에서 자동적으로 redirection을 해주고 있는것인지 궁금합니다.

*가 생략된걸까 해서 *ptr[k]도 똑같이 작동하지 않을까? 해서 시도 해보았으나 피연산자 오류가 떴습니다. ptr[k]는 포인터가 아님을 컴파일러가 지적해 준것 같습니다.

포인터의 index기능?(이 단어가 맞는지 모르겠습니다)을 혹시 설명해 주셨는데 제가 놓친건지요..?

질문을 간단히 요약하겠습니다.

Q. printf("%d ", ptr[k]); 에서 *이 없음에도 array의 value가 출력되는 것은 ptr[k]에 indirection 기능이 내포된 것인가요 ? 

감사합니다. 

답변 3

3

홍정모님의 프로필 이미지
홍정모
지식공유자

간단히 정리하면 2차원도 내부적으로는 메모리에 1차원 배열 형태로 저장되고 위의 포인터는 그 주소를 가져오기 때문에 1차원 배열처럼 인덱싱하는 겁니다. 다차원 배열 인덱싱은 동적할당에 나와요.

3

홍정모님의 프로필 이미지
홍정모
지식공유자

혼동하기 쉬운 부분이네요. Indirection을 내포하고 있다기 보다는 메모리 주소 체계를 생각해보면 2차원 배열도 결국은 내부적으로는 1차원배열이라는 점과 연결시키셔야 합니다. 동적할당 메모리를 다차원 배열처럼 사용하는 방법에 대한 강의를 참고하시면 도움이 될 것 같습니다.

0

이시현님의 프로필 이미지
이시현
질문자

답변 감사드립니다. 이후 뒷부분 강의 내용 참조가 필요하군요. 조금 더 수강하다보면 궁금증이 해결되겠습니다. 감사합니다.