2013년 3월 2일 토요일

일반 포인터와 다중 포인터(삼중 까지)

이번 포스트는 다중포인터 즉, 이중과 삼중포인터에 대해 다룰껀데요.

포인터가 뭔지 모르거나 헷갈리는분들은 링크를 달고 싶지만 이상하게 포인터에 대한 내용을 안 다뤘네요.

그러므로 포인터부터 시작하겠습니다.

1.포인터

포인터는 변수와 달리 방향을 가지고 있습니다.

포인터는 어떤 변수를 가리키는 함수인데, 가리킨 변수의 주소값에 저장을 목적으로 선언 됩니다.

일단 일반포인터에 대해 맛보자면,

ex)
int t=1;
int *t1=t;  // 포인터는 변수앞에 *을 붙입니다.

*t1+=1;
printf("%d",t);

결과는 2가 나옵니다. 즉, 포인터를 더해도 포인터가 가리키는 변수도 바뀝니다.

그러니까 포인터가 가리키는 주소에 1을 더해라!라는 명령을 하였고, 컴파일러는 ㅇㅇ이라는 해석을 한거죠.

포인터도 연산을 하는데 그건 링크를 달아드릴게요.
포인터 연산!

이상하게 포인터연산은 포스팅했는데 포인터는 안했네요.

아무튼 이중 혹은 더블포인터로 넘어 갈게요.

2.이중포인터

일반포인터는 *하나를 이중포인터는 **로 선언합니다.

이중포인터는 일반포인터를 가리키는건데요.

즉, 그러니까 일반포인터가 어떤변수를 가리키고 그 포인터를 이중포인터가 가리키는거죠.

생각해보면 별거 아닙니다.

선언한 숫자를 바꿔주는 프로그램으로 왜 이중포인터가 필요한지 알아보겠습니다.

우선 실패작
보시면 결과는 실패입니다.

왜일까요?

네, 바로 제가 주석처리한 문장이 답입니다.


*t와 *t1은 *pt와 *pt1과 같은 일반포인터이므로 누가 누굴 가르키기는 커녕 전혀 무관합니다.

그래서 SWAPPING 프로그램의 t,t1끼리만 바꾸고 pt까진 바꿔주지못하고 출력해버린겁니다.

그림으로 설명하자면

SWAPPING 대입할 때 상황
* pt ㅡ>(대입)  *t(참조)→t                          
*pt1 ㅡ>(대입)*t1(참조)→t1

SWAPPING 대입하고 해석 상황
*pt ㅡ> *t  ㅡ>t1
           ↑↓
*pt1ㅡ>*t1 ㅡ>t

이렇게 되는겁니다.


그럼 SWAPPING프로그램에다가 이중으로 바꿔준다면? 방향은 바뀌게 될 건데, 실험으로 알아보겠습니다.


이번엔 성공!

왜 성공한줄은 아시겠나요?


모르시겠다면 그림으로 상황설명을 하겠습니다.

스와핑함수에 대입상황

**t ㅡ> *pt ㅡ> t
**t1ㅡ>*pt1 ㅡ>t1

대입 후 함수 해석상황

**t   ㅡ>*pt↘t
**t1ㅡ>*pt1↗t1

그니깐 스와핑함수의 이중포인트 두개는 메인함수의 일반포인터를 계속 가리키고있고 이중포인터가 가리키는 것을 서로 바꿧으므로 이중포인터가 가르키는것도 바뀌기 때문입니다.

처음 실험 때와 차이를 묻는다면, 스와핑함수안에 포인터함수들의 가리키는 방향에 차이입니다.

그러니까 처음실험때는 스와핑안에 포인터들은 자기들끼리 바꾸고 메인함수의 포인터들까지는 바꾸지 못 한것이고, 두 번째 실험엔 이중포인터가 일반포인터를 가리키므로 일반포인터채로 바꿔버린겁니다.

이중포인터는 서로 다른 함수끼리의 변수주소이동에 정말 유용하게 쓰입니다.

그럼 삼중포인터로 넘어가겠습니다.

3.삼중포인터

긴말 안하고 방향이 삼중ㅡ>이중ㅡ>일반포인터 의 순서대로라고만 설명하고 포스트를 마치겠습니다.

참고로 삼중포인터는 *** t로 선언합니다.