인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이성주님의 프로필 이미지
이성주

작성한 질문수

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

10.9 포인터 연산 총정리

&ptr3를 %p로 받아 출력했을때, 값이 같은 이유

작성

·

211

0

안녕하세요!!

복습을 하던 도중 질문이 생겨 문의드립니다.

[그림 1]

[그림 2]

그림 1에서 보면 line 37에서 각각 ptr3의 포인터 주소값, ptr3의 주소에 해당하는 데이터, 그리고 &ptr3의 포인터 주소값을 출력하고 있습니다. 

Differencing을 이용하여 ptr3에서 정수 4만큼을 뺀 뒤, 같은 작업을 반복하면 ptr3의 포인터 주소값, ptr3의 주소에 해당하는 데이터는 변하는데, 왜 &ptr3의 포인터 주소값은 변하지 않는지 궁금합니다.

감사합니다.

답변 1

4

안녕하세요!

ptr3 = ptr3 - 4; 연산을 하는 것은 ptr3 이 가지고있는 데이터값을 수정한 것이지 ptr3 자체의 주소(&ptr)를 바꾼 것이 아니기 때문입니다.

a라는 int 변수가 있다고 가정했을때  a = a - 2; 연산을 했다면 a의 데이터값만 바뀔 뿐 a의 주소가 바뀐다거나 하는 것은 아니죠. 그냥 a라는 변수 공간 안에 있는 데이터가 수정된 것 뿐이지 &a가 바뀌는게 아닙니다. a라는 공간이 이사가는 것이 아니라 a라는 공간 안에 들어있는 데이터가 바뀌는 것 뿐입니다. 

마찬가지로 ptr3도 제가 예시로든 위 a에 똑같이 대응시킬 수 있습니다. 포인터인 ptr3도 '다른 변수의 주소값'이라는 데이터를 저장하는 "변수"일 뿐입니다. 위 예시의 a와 다를게 없습니다. 이 ptr3 변수 값을 ptr3 - 4 로바꿔준 것뿐입니다. ptr3 공간이 어디 이사가거나 해서 집주소가 바뀐게 아니라 안에 들어있는 데이터만 바뀐 것일 뿐이기 때문에 당연히 ptr3의 집주소인 &ptr3은 변함 없는 것입니다. 

강의의 코드를 다시 한번 설명드려보자면 ptr = arr 이면 현재 ptr은 arr 배열의 첫번째 원소의 주소를 데이터로 담고 있습니다. ptr = ptr + 3 를 하면 기존 ptr이 가리키던 곳의 3 칸 앞에 있는 int 데이터를 가리키는 것이 되므로 이제 ptr은 네번째 원소를 가리키게 됩니다. ptr 값(데이터)은 이제 &arr[0] 에서 &arr[3]으로 바뀐 격이므로 *ptr은 이제 100이 아닌 400입니다. 그냥 ptr이 가지고 있는 값이 바뀐거지(&arr[0] 에서 &arr[3]로) ptr 자체의 주소 (&ptr)가 바뀐게 아닙니다.

이성주님의 프로필 이미지
이성주

작성한 질문수

질문하기