은근한

C언어 7. 포인터(이중포인터,포인터 배열) 본문

카테고리 없음

C언어 7. 포인터(이중포인터,포인터 배열)

EsJoo 2013. 10. 29. 18:52

포인터란?..


포인터는 다른변수의 주소를 저장하는 변수 즉 주소를 저장하게 되어진 변수를 가리킨다고 해야되나?..


포인터변수는 변수의 값을 주소로 저장한다.


간단한한 형식으로 보자면


int a = 5;


int *pa = &a;


여기서 포인터변수pa 에 a라는 주소가 저장되었는데 포인터는 a를 가리킨다고 한다.


포인터변수는 포인터형에 관계 없이 항상 크기가 4바이트이다. //주소를 저장하기에 4바이트를 가지고 있다.


ex)


int x;

int *p;

p=&x;    //p에 x주소를 넣는다.

*p = 10;    //p가 가리키는는 변수 . 즉 x에 10을 대입하게 된다.


포인터변수가 가리키는 변수에 접근하는데 사용되는 간접 참조 연산자이다.* 별표..


포인터변수이름 앞에 *를 사용하면 포인터 변수가 가리키는 변수에 접근해서 값을 읽어오거나 변경할 수 있다.




이중포인터


포인터 변수도 주소를 갖기 때문에 포인터 변수의 주소를 저장하는 포인터변수를 선언할 수 있다.


int *형 변수의 주소를 저장하는 변수는 int **형 으로 선언할수 있는데. 이때 사용된 int**를 이중포인터라고 한다.


ex)


int x;

int *p = &x;

int **p = &p;    //pp는 이중포인터


pp     ->     p ->     x

int **         int *      int



이중 포인터가 가리키는 변수에 접급할때도 간접참조연산자인 *를 사용한다. 


만일 이중 포인터가 가리키는 포인터를 이용해서 다시 int 변수에 접근하려면 **처럼 두번 간접참조를 해야한다.


*pp=10;    //p에 접근


**pp = 10;    // x에 접근



배열과 포인터


배열의 이름이 바로 배열의 시작 주소이므로 배열이름으로 포인터 변수로 사용할 수 있다.


ex)


int arr[5];

int *p = arr;


포인터가 배열 원소를 가리키고 있을 때, 포인터를 이용해서 배열의 해당 원소와 나머지 모든 원소에 접근할수 있다.


ex)


*(p+i) = arr[i]

*(arr+i) = arr[i]

*(p+i) = p[i]    // 포인터변수를 마치 배열 이름인것처럼 사용 가능

p+i = &p[i]



배열과 포인터의 차이점


배열은 연속된 같은 데이터형의 변수들의 모임이고, 포인터는 다른 변수의 주소이다.


배열은 일단 메모리에 할당되고 나면 배열의 시작 주소를 변경할수 없지만


포인터변수는 가능하다.


ex) error 배열


int x[5];

int y[5];


x=y;    //error

x++;



ex) 포인터


int x[5];

int y[5];

int *p =x;

p=y;    //이제부터 포인터는 y의 주소를 값으로 가지고 있으므로 y를 가리키게 된다.

p++;