포인터,, 언뜻 알고 쓰고 있는 것 같지만, 실제로 사용하다 보면 메모리 릭 문제나, 프로그램을 죽이는 가장 큰 원인이 되는

아주 프로그래머들의 천국과 지옥을 동시에 느낄 수 있게 하는 녀석이다....

편리하지만, 잘못 쓰면 독이 되는 아주 어려운 녀석이다..

오늘은 이 포인터에 대해서 정리를 해볼까 한다...

그렇다면 먼저 포인터란 무엇인가에 대해서 생각해 봐야겠다...

포인터는 한마디로 정의하자면, 메모리의 위치를 표현한 기호라고 생각하면 된다..

int a; 라는 변수를 선언 하였다고 생각해 보자..

a라는 변수가 할당되면서 메모리 주소에는 4바이트 공간이 할당되고, 그 공간의 시작 위치부터 메모리의 주소(번지)를 가지게

된다..

우리가 흔히 a = 4 ; 이런 대입식을 쓰면 a라는 변수에 기록된 메모리 주소에 4를 입력하게된다.. 이런 처리들이 컴파일러와 프

로그램 내에서 알아서 동작을 한다..

이 때 변수 a의 주소값을 가리킬 수 있도록 해주는 것이 바로 포인터 변수이다...

선언할 때 int *a ; 처럼 쓰는 아이들은 포인터 변수이다.. 이것이 중요하다...

*a 와 a 는 다르다..

a가 어떤 내용이 담기는 번지수가 가르키는 공간이라면, *a는 그 번지의 시작점을 가리키는 포인터 변수다....

이렇게 글로 적으면 좀 이해가 안되지만... 계속 머리속에 그려보거나 공책에 그려보면 이해가 될 것이다...

그리고 또 한가지 명심해야 할 것은 포인터 변수에는 주소값만 들어갈 수 있다는 것이다..

int a ;
int *b ;

라고 선언을 했을 때.. 선언 당시에는 int *b를 했지만 그 이후 사용할 때 *b를 쓰면 또 전혀 의도하지 않은 값이 된다..

이때 *는 연산자의 역할을 하기 때문이다...

선언 이외에  *b ; 를 쓰게 되면, *b는 포인터 변수 b가 가리키고 있는 주소의 내용.. 이 된다..

즉,

int *b ;
b = 4 ; << 이 것은 b에 4라는 주소값을 가리키라는 의미이고,

*b = 4 ; << 이것은 현재 어디인지는 모르지만 b가 가리키고있는 공간에 4라는 값을 대입해라.. 라는 뜻이 된다...

일단 이 부분은 넘어가고,

선언된 a, b를 생각했을 때..

b = a ; 라고 적으면 당연히 의도하지 않은 값이 들어간다... 위의 b = 4 와 같은 의미가 되기 때문이다..

이때는

b = &a ; 이렇게 b에 a의 주소값.. 을 넣어줘야 제대로 동작한다...

이렇게 만들게 되면,

a = 4 ; 이렇게 a 에 값을 넣었을 때, *b를 출력해보면 4가 나온다.. 왜냐하면 b가 현재 가리키고 있는 주소는..

a 이기 때문이다..


이렇게 적고 보니, 굳이 왜 쓰는지 이해가 안될 수도 있지만,

참조의 개념에서 보면 정말 꼭 필요한 기능이다..

포인터 헷갈리지 말고 잘 써야할 녀석이다...


Posted by 바람처럼..
|