inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

10.9 포인터 연산 총정리

ptr1와 &ptr1의 차이점

해결된 질문

386

wnsgh5049

작성한 질문수 3

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 
}

 

c

답변 1

3

Soobak

안녕하세요, 답변 도우미 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

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

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

1

wnsgh5049

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

Export template 안됨

1

45

2

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

1

70

3

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

1

63

2

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

1

62

2

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

1

58

1

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

1

81

2

12.12 헤더 관련 질문

1

63

2

Visual Studio Community 2026 사용 문의

1

149

2

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

1

65

2

getchar(), putchar()

1

96

3

강의자리ㅛ

1

85

2

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

1

119

2

소스파일안에 여러 파일

1

80

2

F5와 F7의 차이

1

82

2

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

1

63

2

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

1

72

1

Step over 기능 문의

1

57

2

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

1

81

2

int main 함수 관련 오류 문의

1

71

2

13.4 words[0]

0

64

2

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

1

65

2

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

1

67

2

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

1

57

2

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

1

56

2