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

김영진님의 프로필 이미지
김영진

작성한 질문수

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

10.5 2차원 배열과 메모리

07:30 int *ptr=&arr[0][0]; 질문있습니다.

작성

·

283

1

2 차원 배열 첫 주소를 포인터에 대입해서 출력할 때

강의를 보면서 들던 생각은 어째서 %d 로 값을 출력하는데

asterisk 를 사용하지 않는지? 그리고 어떻게 포인터에 indexing 을 배열처럼 사용할 수 있는지 궁금합니다.

그리고 포인터에 배열을 사용하지 않고

#include <stdio.h>

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\n", *(ptr+k));

	return 0;
}

이 코드처럼 asterisk 를 사용하여 주소 값에 자료형만큼 더하는 것과 어떤 차이가 있나요?

답변 1

3

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

질문1.) 2 차원 배열 첫 주소를 포인터에 대입해서 출력할 때 강의를 보면서 들던 생각은 어째서 %d 로 값을 출력하는데 asterisk 를 사용하지 않는지?
: 우선, 강의 10.4 포인터와 배열3:33 부분에서 교수님께서 설명해주시듯이, "배열의 이름은 배열이 사용할 수 있는 메모리 공간을 대표하는 메모리 주소" 이며, "내부적으로는 포인터와 비슷" 하여 포인터처럼 쓸 수 있습니다. 또한, C 언어에서 [ ] 연산자를 통해 인덱싱이 다음과 같은 방식으로 이루어집니다.
(1). 포인터에서 인덱스 안의 값을 더합니다. 이렇게 하면 원하는 요소의 메모리 주소로 이동합니다.
(2). 해당 메모리 주소를 참조하여 값을 가져옵니다.
예를 들어서, 포인터 int* ptr 이 배열의 첫 번째 요소의 주소를 가리키므로, ptr[2]*(ptr + 2) 와 동일한 의미를 가집니다. 이런 방식으로 포인터에 대해 배열 인덱싱을 사용하여 값에 접근할 수 있는 것 이에요.

질문2.) 포인터에 배열을 사용하지 않고 이 코드처럼 asterisk 를 사용하여 주소 값에 자료형만큼 더하는 것과 어떤 차이가 있나요?
: 동일한 결과를 출력하며, 표기법만 다릅니다. *(ptr + k) 로 표기하면 포인터 연산과 포인터의 참조에 대한 것을 명확하게 나타낼 수 있으며, ptr[k] 방식은 배열의 인덱싱 표기법을 사용하여 보다 간결하게 코드를 표현할 수 있습니다.

추가적으로, 현재 진도 이후 10.13 포인터의 배열과 2차원 배열 에서 메모리 동적 할당에 대하여 학습하실 때, 교수님께서 보다 자세히 설명해주시므로 참고 부탁드립니다. 특히, 강의 10.13 포인터의 배열과 2차원 배열4:36 부분의 자료화면을 참고하시면 포인터 참조와 배열 인덱싱에 대해 이해하시는 데에 도움이 되실 것 같습니다.

또 궁금하신 점 있으시면 편하게 질문 남겨주세요. 감사합니다. 👍

김영진님의 프로필 이미지
김영진
질문자

자세하게 답변해주셔서 감사합니다 .

김영진님의 프로필 이미지
김영진

작성한 질문수

질문하기