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

wnsgh5049님의 프로필 이미지

작성한 질문수

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

10.9 포인터 연산 총정리

ptr1와 &ptr1의 차이점

해결된 질문

23.03.14 08:49 작성

·

298

1

안녕하세요~ 강의 1분40초 쯤에

printf("%p %d %p\n", ptr1, *ptr1, &ptr1);

코드를 출력하면 값이

002AFAEC 100 002AFAE0

이렇게 나옵니다.

ptr1이랑 &ptr1이랑 arr[0]의 주소를 출력하는 걸로 알고 있는데 다르게 나오는 걸로 보니 제가 잘못 알고 있는 거 같습니다ㅠ ptr1이랑 &ptr1을 출력하면 값이 다르게 나오는데 이 둘의 차이는 무엇일까요? 헷갈리네요

아래에 코드도 첨부해 놓았습니다.

int main()
{
	int arr[5] = { 100, 200, 300, 400, 500 };
	int* ptr1, * ptr2, * ptr3;

	ptr1 = arr;
	printf("%p %d %p\n", ptr1, *ptr1, &ptr1); // 002AFAEC 100 002AFAE0 
}

 

답변 1

3

Soobak님의 프로필 이미지

2023. 03. 14. 11:09

안녕하세요, 답변 도우미 Soobak 입니다.

먼저, 질문자님께서 제가 답변 드리기 수월하게끔 배려해주신 부분들이 너무 잘 느껴져서 인상깊네요. 굉장히 감사드립니다. 🥲

질문에 대한 답변은 다음과 같습니다.

  1. ptr1 은 포인터 자료형의 변수로서, 다른 변수의 주소값을 저장합니다.

    1. 위 코드의 경우에서 ptr1 에 저장된 주소값은 arr 배열의 첫 번째 원소의 주소값 이겠지요!

  2. &ptr1ptr1 변수의 주소를 나타냅니다.

    1. ptr1 역시 자료형이 포인터 타입인 변수 로서, 자기 자신만의 주소값을 갖습니다.

  3. 즉, printf("%p %d %p\n", ptr1, *ptr1, &ptr1); 에서,
    ptr1 의 출력 결과는 ptr1 변수가 저장하고 있는 다른 변수의 주소값 이며,
    &ptr1 의 출력 결과는 ptr1 변수 자기 자신의 주소값 입니다.

이렇게 '포인터 변수 자체의 주소''포인터 변수에 저장된 주소' 에 대한 내용은
강의 9.12 포인터의 작동원리7:08 부분에서 교수님께서 그림을 곁들이셔서 자세히 설명해주시니,
한 번 해당 부분만 다시 참고해보시면 좋을 것 같습니다!

포인터에 대한 개념은 처음에 정말 헷갈리는 것 같아요. 저 또한 처음에 혼란스러웠던 경험이 있습니다.
하지만, 강의를 꾸준히 수강하시면서 학습하시다 보면, 어느 순간 자연스럽게 익숙해지시게 될 거에요! 😀

질문자님께서 제가 답변 드리는 것에 대해 배려를 해주신 만큼,
저도 더욱 질문자님의 학습에 도움이 되고자 고민을 해보았고, 아래 코드를 첨부해 보았습니다.

#include <stdio.h>

int main()
{
  int arr1[5] = { 100, 200, 300, 400, 500 };
  int arr2[5] = { 600, 700, 800, 900, 1000};

  int* ptr1;
  ptr1 = arr1; // ptr1 에 arr1 대입.

  printf ("ptr1 변수에 arr1 를 대입하였습니다.\n");
  printf("ptr1 에 저장된 주소값은 현재 [ %p ] 입니다.\n", ptr1);
  printf("arr1 의 주소값은 현재 [ %p ] 입니다.\n", arr1);
  printf("ptr1 포인터 변수의 주소값은 현재 [ %p ] 입니다.\n", &ptr1);

  ptr1 = arr2; // 이번에는 ptr1 에 arr2 대입.
  printf ("\nptr1 변수에 arr2 를 대입하였습니다.\n");
  printf("ptr1 에 저장된 주소값은 현재 [ %p ] 입니다.\n", ptr1);
  printf("arr2 의 주소값은 현재 [ %p ] 입니다.\n", arr2);
  printf("ptr1 포인터 변수의 주소값은 현재 [ %p ] 입니다.\n", &ptr1);

  printf("\n위 두 가지 경우에서, ptr1 포인터 변수의 주소값은 [ %p ] 로 동일합니다.\n", &ptr1);

  return 0;
}
  • 출력 결과 예시
    image

해당 코드를 복사하셔서, 여러가지 경우들에 대해 직접 대입해보시면서 결과를 확인해보시면 포인터에 대한 개념을 이해하시는 데에 조금 더 도움이 되실 것 같아요!

도움이 되셨길 바라며, 또 궁금하신 점 있으시다면 편하게 댓글 남겨주세요! 감사합니다. 화이팅!! 😀

wnsgh5049님의 프로필 이미지
wnsgh5049
질문자

2023. 03. 14. 14:14

감사합니다~ 헷갈렸는데 잘 정리가 되었습니다😀