작성
·
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)가 바뀐게 아닙니다.