위 포스팅 내용은 윤성우의 열혈 C 책을 참고하였습니다.
이 블로그는 독자들이 대체로 처음 해당 문법을 접할 것이라고 가정하고 적는 것이기 때문에
포인터란 무엇인가에 대해 간단하게 요약해드리겠습니다.
포인터 변수와 & 연산자
포인터의 사용을 이해에 앞서 간단한 예시를 들어보겠습니다.
위 세줄의 코드는
첫 번째 줄 : 정수 10이 저장된 num을 선언
두 번째 줄 : 포인터 변수 ptr을 선언 (주솟값 저장을 위해)
세 번째 줄 : ptr에 num의 주솟값을 저장시킨다.
라고 간단하게 이해하시면 됩니다.
세 번째 줄에서 &는 "오른쪽에 등장하는 피연산자(num)의 주솟값을 반환하는 연산자" 이고 잘 이해해두어야 합니다.
참고로 포인터 변수를 선언할 때 *는 어디 쪽에 붙여도 무관합니다.
( int* ptr == int * ptr == int *ptr )
위 코드를 그림으로 그려보자면 다음과 같습니다.
그림이 아주 정신없죠?
위 그림에서 캐치해야될 부분은 ptr에 저장된 값이 num의 시작번지의 주솟값이라는 점입니다.
그래서 ptr(포인터) 를 통해서 num의 메모리에 접근할 수 있는 것입니다.
그 다음으로 중요한 점은 포인터 변수 ptr의 크기가 8바이트라는 것입니다.
위 그림에서는 제가 8바이트로 그렸지만, 사실 8바이트가 아니라 4바이트가 될 수 있습니다.
왜냐하면 운영체제가 32바이트인 경우에 포인터의 크기는 4바이트 ,
64바이트인 경우에는 8바이트로 결정되기 때문입니다.
저는 현재 Visual Studio 2019 버전을 사용하고 있는데 32 비트 64비트 모두 지원하기 때문에
두 경우를 모두 테스트 해보았습니다.
Debug 옆에 선택란에서 x86을 선택하면 32비트로 컴파일할 수 있습니다.
이 경우에 테스트하면 ptr의 크기가 4바이트로 나옵니다.
반대로 64비트에서 테스트해보면 ptr의 크기가 8바이트로 나옵니다.
각자 포인터공부하시면서 내가 그동안 32비트로 컴파일했는지 64비트로 컴파일했는지도 확인해보시길 바랍니다.
* 연산자를 활용한 예시
추가로 * 연산자를 활용한 기본적인 예시를 하나 보여드리겠습니다.
다음의 내용을 그림으로 또 표현해봤는데요
나옹이가 숨겨둔 금화창고에 금화와 은화를 채워넣는 이야기입니다.
1.Ptr=&금화;
라는 코드를 통해 나옹이는 금화창고로 가는 길을 선택하게 됩니다.
2.(*ptr)+=50;
그리고 나옹이는 열쇠 (*) 를 통해 창고로 완전히 들어가게 되고 금화를 50개 넣어두고 나옵니다.
그런데 갑자기 나옹은 은화를 채워야겠다는 생각이 들어 길을 다시 바꾸게 됩니다.
3.Ptr=&은화;
이번에는 위의 코드를 통해 나옹이는 은화창고로 가는 길을 선택하게 됩니다.
4.(*ptr)+=30;
그리고 나옹이는 열쇠 (*) 를 통해 은화창고로 완전히 들어가게 되고 은화를 30개 넣어두고 나옵니다.
(참고: 윤성우의 열혈 C)
위의 예시가 가장 중요하게 말하고자 하는바는
"하나의 포인터변수 ptr로 여러가지 메모리(금화, 은화)에 접근할 수 있다" 였습니다.
포인터에 대한 더 자세한 내용은 나음 포스팅에서 찾아뵙겠습니다.
다들 좋은 하루 되세요~