위 포스팅 내용은 윤성우의 열혈 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비트 모두 지원하기 때문에 

 

두 경우를 모두 테스트 해보았습니다.

 

 

32비트체제

 

Debug 옆에 선택란에서 x86을 선택하면 32비트로 컴파일할 수 있습니다.

이 경우에 테스트하면 ptr의 크기가 4바이트로 나옵니다.

 

64비트체제

 

반대로 64비트에서 테스트해보면 ptr의 크기가 8바이트로 나옵니다.

 

각자 포인터공부하시면서 내가 그동안 32비트로 컴파일했는지 64비트로 컴파일했는지도 확인해보시길 바랍니다.

 

 


* 연산자를 활용한 예시 

 

추가로 * 연산자를 활용한 기본적인 예시를 하나 보여드리겠습니다.

 

 

 

다음의 내용을 그림으로 또 표현해봤는데요

 

 

나옹이가 숨겨둔 금화창고에 금화와 은화를 채워넣는 이야기입니다.

 

1.Ptr=&금화;

 

라는 코드를 통해 나옹이는 금화창고로 가는 길을 선택하게 됩니다.

 

2.(*ptr)+=50;

 

그리고 나옹이는 열쇠 (*) 를 통해 창고로 완전히 들어가게 되고 금화를 50개 넣어두고 나옵니다.

 

 

그런데 갑자기 나옹은 은화를 채워야겠다는 생각이 들어 길을 다시 바꾸게 됩니다.

 

3.Ptr=&은화;

 

이번에는 위의 코드를 통해 나옹이는 은화창고로 가는 길을 선택하게 됩니다.

 

4.(*ptr)+=30;

 

그리고 나옹이는 열쇠 (*) 를 통해 은화창고로 완전히 들어가게 되고 은화를 30개 넣어두고 나옵니다.

 

 

(참고: 윤성우의 열혈 C)

 


위의 예시가 가장 중요하게 말하고자 하는바는

 

"하나의 포인터변수 ptr로 여러가지 메모리(금화, 은화)에 접근할 수 있다" 였습니다.

 

포인터에 대한 더 자세한 내용은 나음 포스팅에서 찾아뵙겠습니다.

 

다들 좋은 하루 되세요~

+ Recent posts