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

양주원님의 프로필 이미지
양주원

작성한 질문수

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

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

강의 초반부 질문

작성

·

112

·

수정됨

1

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

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

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

답변 1

1

안녕하세요? 질문&답변 도우미 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 에 저장된 값이 출력됩니다.

 

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

양주원님의 프로필 이미지
양주원
질문자

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

안녕하세요? 질문&답변 도우미 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
양주원님의 프로필 이미지
양주원
질문자

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

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

 

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

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

양주원님의 프로필 이미지
양주원

작성한 질문수

질문하기