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

용개형멋져님의 프로필 이미지
용개형멋져

작성한 질문수

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

10.9 포인터 연산 총정리

3분 15초 경에 제 생각이 맞는 건가요?

해결된 질문

작성

·

274

3

int arr[5] = { 100, 200, 300, 400, 500 };

int* ptr1, * ptr3;

ptr1 = arr;

ptr3 = ptr1 + 4;

일 때

배열의 이름은 배열의 첫 번째 공간의 주소이다. 라고 한다면
ptr1은 arr[0]을 가리킨다.
ptr1 = arr
arr == &arr[0]
이라서 ptr1 + 4는 &arr[0] + (arr[0]의 자료형인 int의 크기) * 4 이고

 

배열의 이름은 배열의 첫 번째 공간의 주소를 가리키는 포인터와 비슷한 무언가이다. 라고 한다면
ptr1은 arr을 가리키고 arr은 arr[0]을 가리킨다.
ptr1 = &arr
&arr != &arr[0]
라서 ptr1은 arr[0]을 직접 가리키는 게 아니라 arr을 직접 가리키는거고
ptr1 + 4는 &arr + (arr의 자료형의 크기) * 4
인데 arr은 포인터와 비슷한거지 포인터가 아니라
주소도 없고 자료형도 없는데 여기서 뭔가 말이 모순되는 것 같고

 

계산 결과를 보면 후자는 절대로 아닌거 같은데
배열의 이름은 배열의 첫 번째 공간의 주소를 가리키는 포인터와 비슷한 무언가이다.
라는 표현은 맞는 표현 아닌가요?
맞는 표현인데도 불구하고 포인터와 비슷한 무언가라고 생각하고
ptr1 + 4를 하면 결과가 잘못되는 게 뭔가 아닌거 같아요.

 

제 생각의 어떤 부분이 뭐가 잘못된 거죠?

답변 1

3

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

 

배열의 이름은 말씀하신대로 배열의 첫 번째 공간의 주소를 가리킵니다.
하지만, 배열의 이름이 실제 포인터 변수는 아닙니다.

 

배열의 이름은 포인터와 유사하게 작동하지만, 주소를 가리키는 상수 형태이며, 그 자체로 주소를 변경할 수 없습니다.
반면, 포인터 변수는 주소를 변경할 수 있습니다.
또한, 배열의 이름은 스스로 별도의 메모리 공간을 가지고 있지 않습니다.

 

질문해주신 코드에서, &arr 은 전체 배열의 주소를 나타내며, 타입은 int (*)[5] 입니다.
반면, &arr[0] 은 배열의 첫 번째 원소의 주소를 나타내며, 타입은 int* 입니다.
두 표현은 같은 메모리 위치를 가리키지만, 타입이 다릅니다.

 

이를 바탕으로 ptr1 + 4 포인터 연산을 했을 때, 해당 연산은 배열의 다섯 번째 요소(인덱스 4)의 주소를 가리키게 됩니다.

용개형멋져님의 프로필 이미지
용개형멋져

작성한 질문수

질문하기