inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

9.13 포인터의 기본적인 사용 방법

강의 초반부 질문

175

양주원

작성한 질문수 21

1

a와 a_ptr을 출력했을 때 왜 동일한 값이 나오는지 이해가 가지 않습니다.

전 a에는 123이 저장이 됐고 포인터 변수 a_ptr을 선언하고 포인터 변수가 a의 주소를 가리키니까 a의 주소 시작점이 정수로 출력된다고 이해했는데 이게 틀린 건가요? 앞강의에서 보면 a에 저장된 값과 주소의 시작점이 같진 않아서 다르게 출력될 것이라고 예상을 했는데 어디가 틀린 것인지 잘 모르겠습니다.

그리고 강의가 진행됨에 따라 *a_ptr의 값이 변화가 없던데 이것도 잘 이해가 가지 않습니다. a의 값이 바뀜에 따라 주소도 바뀔 거라고 생각했는데 혹시 이게 아니면 똑같은 위치에 a의 값만 바꿔넣는 식으로 컴퓨터가 작동하는 것인가요?

c

답변 1

1

Soobak

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

먼저, * (asterisk) 는 변수를 선언할 때는 '포인터' 변수를 선언함을 의미하지만,
변수를 선언할 때가 아닌 경우, '역참조' 를 하는 것을 의미합니다.

여기서, '역참조' 는 포인터 변수에 담긴 주소, 즉, 포인터 변수가 가리키는 메모리 공간의 값을 가리키는 것을 의미합니다.

 

따라서, int a = 123 그리고 int *a_ptr = &a 와 같은 경우에서,
a_ptr 이라는 포인터 변수는 변수 a 의 주소를 가리키게 됩니다.

하지만, 이후의 printf() 함수에서 *a_ptr 는 포인터 변수 a_ptr 이 가리키고 있는 a 변수에 담긴 값, 즉, 123 을 역참조하는 것을 의미합니다.

 

즉, 질문자님께서 혼동하시는 것으로 생각되는 '포인터 변수에 담긴 값'(주소) 와 '포인터 변수에 담긴 값(주소)이 가리키는 값' , 두 부분을 구분해보시면 좋을 것 같습니다.

 

단순하게 요약드리면,
*a_ptr 은 포인터 변수 a_ptr 이 가리키는 주소의 값을 출력합니다.
a_ptr 자체를 출력하면 a 의 주소가 출력되지만, *a_ptr 을 출력하면 a 에 저장된 값이 출력됩니다.

 

위 내용을 이해해보시면 궁금증 해결에 도움이 되실 것 같습니다.
혹시 이해가 어려우시다면 편하게 댓글 남겨주세요.

1

양주원

a_ptr=&a에서 & 때문에 a_ptr을 출력하면 a의 주소가 나오는 것까지는 이해를 했는데 *a_ptr을 출력했을 때가 이해가 안 가는 것 같네요. 강의 다시 볼 때도 계속 헷갈리는데 조금만 더 설명해주시면 감사하겠습니다.

1

Soobak

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

조금 더 자세히 설명드리면 다음과 같습니다.

 

먼저 기본적인 예시 코드를 살펴보자면 다음과 같습니다.

int a = 123; // 변수 a에 123을 저장
int *a_ptr = &a; // 포인터 변수 a_ptr에 a의 주소를 저장

: 여기서, a123 이라는 '값' 을 가지는 변수입니다.
그리고, &a 는 '변수 a 의 주소' 입니다.
포인터 변수 a_ptr 은 이 주소를 저장합니다.

 

여기서, 궁금해하시는 printf("%d\n", *a_ptr); 의 경우에서, *a_ptra_ptr 이 가리키는 주소를 '역참조' 합니다.
이 때, '역참조' 한다는 것은, a_ptr 이 가리키고 있는 메모리 주소(변수a 의 주소)에 접근하여, 그 주소에 저장된 실제 값(123) 을 가져오는 것을 의미합니다.

 

저의 경우, 포인터를 처음 공부할 때, 포인터 변수는 '주소'를 가리킨다는 것과 함께 다음의 개념들을 구분해보려 노력하는 것이 도움이 많이 되었습니다.

  • 변수 a 의 값

  • 변수 a 의 주소

  • 포인터 변수 a_ptr 의 값(주소)

  • 포인터 변수에 담긴 값(주소)을 역참조(*a_ptr)하여 얻게되는 값

한 번, 다음과 같이 직접 변수 a 에 담긴 값과, a 의 주소, a_ptr 에 담긴 값(a의 주소), *a_ptra_ptr 에 담긴 값(a 의 주소) 을 역참조한 값(a 의 값)을 각각 출력해보시면 이해에 좀 더 도움이 되실 것 같습니다.

int a = 123; // 변수 a에 123을 저장
int *a_ptr = &a; // 포인터 변수 a_ptr에 a의 주소를 저장

printf("%d\n", a); // 변수 a의 값을 출력, 결과는 123
printf("%p\n", a_ptr); // 포인터 변수 a_ptr의 값을 출력, 결과는 a의 주소 (예: 0x424242424242)
printf("%d\n", *a_ptr); // 포인터 변수 a_ptr이 가리키는 값, 결과는 a의 값인 123

1

양주원

a가 123일 때는 이해가 됐는데 a_ptr=456;이라는 문장이 끝났을 때 a의 값이 바뀌는 것이 이해가 안 갑니다. *a_ptr이 &a에 저장된 실제값을 가져오면 a는 어느 포인트에서 바뀐 것이죠?

0

Soobak

a_ptr = 456; 이라고 말씀해주셨는데, 아마 *a_ptr = 456; 을 말씀하시는 것 같습니다.

 

*a_ptr = 456; 에서 a_ptr 에는 변수 a 의 주소가 저장되어있습니다.
따라서, *a_ptra 의 주소에 접근하게 되며, *a_ptr = 456;a 의 주소에 접근하여 456 이라는 값을 저장하게 됩니다.

즉, a_ptr 이 가리키는 주소 (a 의 주소) 에 접근하여 456 이라는 값을 저장하는 것입니다.

Export template 안됨

1

36

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

59

3

main 함수에서 왜 int만 선언이 되는걸까요

1

58

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

56

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

50

1

프로토타입과 함수간의 인자 불일치

1

74

2

12.12 헤더 관련 질문

1

61

2

Visual Studio Community 2026 사용 문의

1

140

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

62

2

getchar(), putchar()

1

95

3

강의자리ㅛ

1

81

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

115

2

소스파일안에 여러 파일

1

77

2

F5와 F7의 차이

1

80

2

c = TWO * (a+b); 에서 a와 b는?

1

61

2

; 세미콜론을 붙이는 기준에 문의

1

71

1

Step over 기능 문의

1

55

2

2.6 강의 따옴표 출력 규칙 문의

1

78

2

int main 함수 관련 오류 문의

1

70

2

13.4 words[0]

0

62

2

11.7 함수를 구현해 봤습니다.

1

63

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

66

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

54

2

11.6 fit_str함수를 구현해 봤습니다.

1

55

2