2012년 8월 30일 목요일

포인터

포인터는 다른 변수의 주소값을 가지는 특별한 변수이다.
*는 포인터의 내용 연산자이다.
&는 포인터의 주소 연산자이다.

 일반 변수포인터 변수 
 선언 int a; // 정수형 변수 a int *a; // 포인터 변수 a를 종수형으로 선언
 값 할당 int a = 100; // 변수 a에 100할당 *a = 100; // a 주소에 100 할당
 주소 참조 &a; // 변수 a의 주소 a; // 주소
 주소 연산 할 수 없음 a--; // 포인터를 1 감소



선언

 1 자료형* 포인터변수명;

 1 int* p;

변수 p는 포인터 변수이며, 정수형의 값을 가지는 변수에 대한 주소를 가진다.
선언시에 사용되는 *는 내용 연산자가 아니다.


초기화

포인터 변수는 반드시 초기화 후에 사용해야 한다.
 1 int* p;
 2 int i;
 3 p = &i;


포인터 변수의 크기

포인터 변수의 자료형은 포인터가 가르키는 변수의 자료형이다. 포인터 변수의 크기는 포인터가 가르키는 자료형의 크기와 무관하다.
 1 #include <stdio.h>
 2 
 3 /*
 4     포인터의 크기
 5 */
 6 
 7 int main ()
 8 {  
 9     int i = 4;
10     int* p_i = &i;
11     char ch = 'a';
12     char* p_ch = &ch;
13     double dbl = 1.0;
14     double* p_dbl = &dbl;
15 
16     printf("%d\n", sizeof(p_i));
17     printf("%d\n", sizeof(p_ch));
18     printf("%d\n", sizeof(p_dbl));
19 
20     system("PAUSE");
21     return 0;
22 }


배열과 포인터

배열 arr[]의 이름인 arr는 배열의 첫번째 요소인 arr[0]의 주소이다. 따라서, data==&data[0]이다.


포인터 연산

포인터에 저장된 주소값을 변경하는 연산이다. 포인터의 값을 증감시킬 때 실제로 증감되는 주소는 포인터변수의 자료형에 따라 달라진다.
곱하기, 나누기 등의 연산은 할 수 없다.


void형 포인터

 1 void* 포인터이름;

프로그램 실행시에 자료형이 결정되는 경우에 사용한다. 저장하기 전에 명식적 형변환이 필요하다.


char형 포인터

문자열 처리에 char형 포인터를 사용할 수 있다.
 1 char* ch = "CHARACTER";

 1 char ch[] = "CHARACTER";



이중포인터

 1 int** p;

p : 기억공간 주소.
*p : 주소 p에 수록된 주소.
**p : 주소 *p에 수록된 int형 데이터.


포인터 배열

 1 char *name1, *name2, name3;

 1 char* name[3];



함수 포인터

 1 자료형(*함수포인터이름)(매개변수목록);

 1 int add(int, int);
 2 int (*f1) (int x, int y);
 3 int add (int a, int b) {return a+b; }
 4 
 5 f1 = add;
 6 f1 = &add;
 7 f1 = add(); // X
 8 f1 = &add(); // X


원거리 주소 변수

 1 자료형 far* 변수;