&ptr3를 %p로 받아 출력했을때, 값이 같은 이유
223
작성한 질문수 3
안녕하세요!!
복습을 하던 도중 질문이 생겨 문의드립니다.
[그림 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)가 바뀐게 아닙니다.
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
48
3
main 함수에서 왜 int만 선언이 되는걸까요
1
53
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
53
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
46
1
프로토타입과 함수간의 인자 불일치
1
72
2
12.12 헤더 관련 질문
1
59
2
Visual Studio Community 2026 사용 문의
1
135
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
59
2
getchar(), putchar()
1
92
3
강의자리ㅛ
1
78
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
112
2
소스파일안에 여러 파일
1
74
2
F5와 F7의 차이
1
75
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
68
1
Step over 기능 문의
1
52
2
2.6 강의 따옴표 출력 규칙 문의
1
74
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
60
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
64
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2
11.5 코드 구현
1
67
2





