Brise

쉽게 이해하는 포인터 본문

프로그램/C,C++

쉽게 이해하는 포인터

naudhizb 2014. 9. 1. 02:25
반응형


C언어에서 가장 이해하기 힘든 것이 바로 '포인터'이다.


포인터란 말 뜻대로 가리키는 것이다.


무엇을? 가리키냐 하면


바로 변수를 가리키는 것이다.





'능엄경'이라는 책에


'견월망지' 라는 말이 있다.


바로 


'달을 보기 위해서는 손가락 끝을 보지말고 손가락 끝이 가리키는 달을 보라'


라는 말이다.


이 말마따나 포인터란 당연히 손가락 끝을 가리키는 것이다.




포인터 주소의 크기는 


프로세서가 사용하는 메모리 주소의 크기와 동일하다.


왜냐고??


포인터는 '주소'를 가리키기 때문이다.


예를 들어 32비트 프로세서의 포인터는


32비트가 된다.


그런데 여기서 중요한점은 아무런 것도 해주지 않으면(void)


포인터가 가리키는 것이 '달'인지 '해'인지 모른다는 것이다.



때문에 '~~한 타입의 포인터' 이다. 라고 선언해 주는것이 포인터의 타입니다.








예를 들어, 


char * 검지손가락;


이라고 하면


검지 손가락이 가리키고 있는 곳의 주소에는


char라는 8비트짜리 데이터가 있다는 것을 말할 수 있다.



만약에 같은 값을 (unsigned char *)로 캐스팅 한다면


다른 값을 받는 것을 알 수 있다.








'*' 과 '&'




이걸 이해하기 위해, 컴퓨터 세계에 한번 괴상한 호텔을 만들어보자.


이 호텔의 이름은 'Portal 호텔' 이고, 방안에는 무엇이 있을지 모르며, 심지어 포탈! 이 있을 수도 있다.


이 호텔의 각 방 앞에는 메모리 주소가 적혀있고, 


방에 붙여진 특이한 이름들이 있다.


간단한 예제로


long 달 = 100;

long *검지손가락 = &달;


이라고 해보자.


(** 참고 : long형 변수는 4바이트이고

각 호텔의 호수는 1바이트라고 가정한다.)



'달'이라는 long형 변수가 만약 601호에 배정이 되었다고 하면


&달 = 601 이 된다.


또한, 이 주소는 'long'형 변수로 할당되어 있으므로


601호 부터 604호까지 방이 붙어있게 된다. 



그리고 601호의 문을 열면


달 = 100 이 있는 것이다.


 



그렇다면, 포인터 변수는 어떻게 되는 것일까?


검지손가락은 101호에 방을 배정받았다고 하자.


그럼 검지손가락(101호)의 문을 열면


검지손가락 = 601 이라는 값만 있게 된다.


(주 : 포인터 변수는 당연하게 '주소'라는 값을 가지고 있기 때문에 운영체제의 bit수를 따라간다.

32비트 운영체제는 포인터 변수가 32비트, 64비트 운영체제는 64비트)



???


이건 우리에게 쓸모 없는 값이다...


그래서 여기에서 마법의 주문 '*' 를 사용해야한다!


*을 사용하게 되면


포탈이 생성되서 바로 601호에 있는 '달' 이라는 변수에 접근이 된다!


* 검지손가락 = 100 이 되는 것이다.




이러한 포인터가 어떤 장점이 있는지 모르는 사람들이 있을 것이다.


간단하다.


'원래는 갈수 없는 곳을 가게 해준다.'

 

매트릭스 영화를 본 사람들이라면 쉽게 이해할만한 예를 들어보겠다.

 

매트릭스에서 아키텍트(설계자)를 만나기 위해

 

키메이커를 찾아가는데

 

그냥 문을 열 때는 방문을 여는 것과 같지만,


 

키를 꽂고 돌리면 새로운 곳으로 가게 된다.

 

이와 마찬가지로

 

원래대로라면, 함수 안에서는 함수안의 지역변수와 전역변수에만 접근 가능하지만

 

포인터를 이용하면 다른 함수의 변수들도 접근 가능하다!

 

심지어 함수까지도 포인터로 접근이 가능하다!!




포인터의 전달 방법


1)

void function( int * test);


int A;

int *Apointer = &A;


function( Apointer);


function( (int *) &A);


2)

void function( int * test);



int *Apointer;

Apointer = (int *) malloc( sizeof(int) );


function( Apointer);


free(Apointer);



 

 


위와 같은 방법으로 포인터 형 변수를 전달 할 수 있다. 





반응형

'프로그램 > C,C++' 카테고리의 다른 글

2차원 포인터의 값과 주소 접근 방식  (0) 2015.12.12
C언어 표준매크로  (0) 2015.08.20
C언어의 변수형 정리  (0) 2015.08.14
Call by value, Call by reference  (0) 2015.05.11
2차원 배열 함수 호출 예제  (0) 2015.05.11
함수 포인터 배열 예제  (0) 2015.02.13
Efficient C coding  (0) 2014.09.30
Comments