포인터의 이해

언어로그/C/C++ 2011. 3. 11. 00:58





1. 포인터(pointer)
단어의 의미와 같이 특정 메모리를 가리킬 수 있는(참조) 변수를 의미한다. 
포인터는 변수의 주소를 저장할 수 있으며, 32비트 시스템에서 통상 4바이트를 갖는다.




2. 포인터를 사용하는 이유는?
포인터를 사용하면,  빠르고 간결한 프로그램을 작성할 수 있기 때문이다. 포인터를 제대로 사용하지
못하면 난해한 프로그램이 될 수 있지만, 잘 알고 사용하면, 유연하면서도 , 빠르고 간결한 프로그램을 작성할 수 있다.



3. 포인터의 특성
포인터를 사용하여 일반변수와 함수를 다룰 수 있다.  포인터로 변수에 접근하기 위해서는 포인터가 다룰 메모리의 크기를
알아야 의미있게 메모리를 해석할 수 있다. 그렇게 때문에 포인터 변수 선언시 어떻게 메모리를 해석할 것인지 알려주어야
한다.  (포인터 타입은 포인터가 가리키는 대상체 메모리의 단위크기이다.)

char    *cp;
int    *ip;
float    *fp;
double    *dp;

위와 같은 선언은  포인터가 가리키고 있는 메모리를 몇 바이트씩 읽되, 어떻게 데이터를 읽어내겠다는 것을 의미한다.

int a;
int *ip1, *ip2;
ip1 = &a;
ip2 = ip1;

포인터도 변수이기 때문에 포인터 변수에 다른 변수에 주소값을 갖도록 변경할 수 있으며, 또한 변수에 대해 동일한 주소를 
가리키는 여러 포인터를 유지 할 수도 있다.





4. 포인터 연산
포인터 간의 곱셉과 나눗셈은 허용되지 않는다. (컴파일 에러 발생)
포인터 간에 덧셈은 허용하지 않지만, 포인터와 상수의 덧셈은 허용된다..
포인터 간에 뺄셈과 포인터와 상수간에 뺄셈도 허용된다. 

ip1 * ip2// 컴파일 에러     
ip1 / ip2// 컴파일 에러   
ip1 + ip2// 컴파일 에러   

위와 같은 경우는 컴파일 에러가 발생한다.  포인터가 갖을 수 있는 일정 주소범위를 벗어날 수 있기때문에 에러로 보호된다.

ip1 + 1//  4바이트(int) 뒤로 이동 
ip1 - ip2          //  ip1이 1004, ip2가 1008이면, 1이 반환됨 ( (1008-1004)/4 )       
ip2 - 1    //  4바이트(int) 앞으로 이동

포인터 연산을 위해 사용된다. 포인터에 1을 더하는 것은 포인터가 메모리 블럭을 한칸 건너뛰는 작용을,  
1을 빼는 것은 포인터가 이전 메모리 블럭으로 건너뛰는 작용을 한다.  포인터에서 포인터를 빼는 것은 
메모리의 차를 구하는 연산으로,  주소값에 차를 포인터가 가리키는 타입의 바이트수로 나눗값이 계산된다. 
즉 메모리블럭의 차가 반환된다.

 ※ %I64d 변환코드 : double을 첫번째 비트를 부호비트, 나머지 63비트를 데이터 비트로 해서 정수로 해석한다.
                                      큰 단위의 정수를 다룰 때 사용한다.  




5. 증감연산자와 역참조 연산자의 결합 
*pa++;// *pa;pa = pa + 1;              
(*pa)++; // *pa;  *pa = *pa + 1;        
++*p;// *pa = *pa + 1;*pa;     
*++p;// pa = pa + 1; *pa;      

증감연산자와 역참조 연산자를 위와 같이 조합하여 다양하게 사용할 수 있지만, 실행되는 각 의미는 매우 다르다.
역참조 연산자 *와 증감연산자++는 그 우선순위가 같지만, 좌측결합성을  갖기때문에 오른쪽에서 왼쪽으로 평가된다.
(오른쪽에 있는 연산자를 먼저 적용한다.)





6. void 형 포인터
어떤 타입의 형도 가리킬 수 있는 포인터. 즉 대상체 크기가 정해져 있지 않은 포인터이다.
형변환 없이도 void형 포인터변수에 다른 타입의 포인터를 대입할 수 있다. 하지만 void형 포인터에서
값을 읽을 때는  몇바이트를 읽고, 어떻게 데이터를 해석해야 하는지를 알아야 하기 때문에 캐스트 연산자를
사용해야 한다.  void형 포인터를 사용하면, 각 타입을 위한 포인터 변수를 만들어야 하는 번거로움을 줄여 사용변수에 
개수를 줄일 수 있고, 함수의 인자로 사용하여 유연한 프로그램을 작성할 수 있다.  하지만 잘못 사용하면 가독성이 
떨어지고, 난해한 프로그램이 될 수 있다. 


'언어로그 > C/C++' 카테고리의 다른 글

전역변수와 지역변수  (0) 2011.03.27
함수의 이해  (0) 2011.03.27
포인터의 이해  (0) 2011.03.11
매크로, 연산자  (3) 2011.03.10
표준입출력함수 getchar() / putchar()  (0) 2011.02.22
비표준 입출력함수 getch(), getche()  (0) 2011.02.22