해결된 질문
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 입니다.
먼저, 질문자님께서 제가 답변 드리기 수월하게끔 배려해주신 부분들이 너무 잘 느껴져서 인상깊네요. 굉장히 감사드립니다. 🥲
질문에 대한 답변은 다음과 같습니다.
ptr1
은 포인터 자료형의 변수로서, 다른 변수의 주소값을 저장합니다.
위 코드의 경우에서 ptr1
에 저장된 주소값은 arr
배열의 첫 번째 원소의 주소값 이겠지요!
&ptr1
는 ptr1
변수의 주소를 나타냅니다.
ptr1
역시 자료형이 포인터 타입인 변수 로서, 자기 자신만의 주소값을 갖습니다.
즉, 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;
}
출력 결과 예시
해당 코드를 복사하셔서, 여러가지 경우들에 대해 직접 대입해보시면서 결과를 확인해보시면 포인터에 대한 개념을 이해하시는 데에 조금 더 도움이 되실 것 같아요!
도움이 되셨길 바라며, 또 궁금하신 점 있으시다면 편하게 댓글 남겨주세요! 감사합니다. 화이팅!! 😀
2023. 03. 14. 14:14
감사합니다~ 헷갈렸는데 잘 정리가 되었습니다😀