inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.9 포인터 연산 총정리

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

223

이성주

작성한 질문수 3

0

안녕하세요!!

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

[그림 1]

[그림 2]

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

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

감사합니다.

c

답변 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