포인터


이해하기도 어렵고 악명높은 포인터에 대해 이야기해보도록 하겠습니다.


사전적 의미로는

Point : 가리키다, 지적하다

라는 의미를 갖고있습니다.


선언법은 아래와 같습니다.


int *p;

char *c;

float *k;


와 같이 만듭니다.


그럼 일반적인 기억공간의 선언과 비교를 해보자면!


위 그림과 같이 int *p라고 선언할 때에는 p라는 이름의 주소번지를 담을 수 있는 기억장소가 만들어집니다.

따라서, 이렇게 선언이 된 경우에는 p = 30; 과 같은 구문은 동작하지 않습니다.

 - p라는 공간은 주소번지만 담을 수 있는 공간이거든요!!

 - 30과 같은 정수형 변수는 넣을 수 없습니다. 주소가 아니기 때문이죠


정작 정수형 변수를 넣을 수 있는 공간은 *p라는 기억장소입니다.

 - *p = 30 은 된다 요말입니다.


그럼 *p는 무엇인가?

*p에서 *는 연산자입니다.

* 이것이 바로 포인터 연산자입니다.

 - * : 가리킨다, 포인터 연산자이기 때문에 p가 가지고 있는 주소번지를 가리킨다 라고 생각하시면 되겠습니다.

 - 즉, p에는 0033:00A0 와 같은 메모리의 주소번지를 가질 수 있으며 이 주소번지를 찾아간 기억장소가 바로 *p인 것입니다.

 - 바로 이 *p의 기억장소에 정수형 데이터를 저장할 수 있다는 이야기입니다.



예제를 볼까요


위 프로그램은 제대로 동작하지 않습니다.

왜 그럴까요?

얼핏 보면 문제가 없어보입니다. x = 30과 같이 주소번지가 들어갈 장소에 정수형 데이터를 넣은 것도 아니고,

*x = 32; 로 데이터 공간에 잘 넣어줬기 때문이죠

하지만, int *x;로 선언했을 때 x라는 이름의 주소번지를 담을 수 있는 기억공간을 만들었지 아직 그 주소번지를 넣지 않았습니다. 따라서 그 주소를 찾아가라는 뜻의 *x는 무모한 작업일 수 밖에 없죠

 - 집 주소를 따라가 봤는데 집이 없더라!!


 - x 는 초기화 없이 사용되고있습니다.

따라서 컴파일러는 집을 못찾겠다는 에러를 남기게 되죠.


그럼 제대로 된 프로그램을 만들어보겠습니다.


프로그램에서 못보던게 하나가 나왔네요?

바로 & 라는 기호입니다.

이때의 & 는 연산자로서(AND 연산자 아닙니다!) '주소번지를 구하라'라는 뜻의 연산자입니다.

 - 주의 : 여기서 사용된 &는 레퍼런스 연산자하고는 또 다릅니다. (레퍼런스에 대해서는 차후 포스팅하겠습니다.)

 - 변수앞에 사용된 &은 주소 구하기 연산자입니다.


결국, k라는 이름의 기억공간에 대한 주소번지를 구해서 x인 주소번지를 넣을 수 있는 공간에 넣어라! 라는 뜻이 되겠습니다.

x는 주소번지를 저장할 수 있는 기억공간이기 때문에 이게 가능한 것입니다.

 - *x : 기억공간!!

 -  x : 주소공간!!

되시겠습니다.



이런 구조입니다.

결국

x가 담고있는 것은 : k의 주소번지

*x 의 값은 : 32

결국 k도 32

*x와 k는 같은 주소번지를 가지고 있고, 같은 기억공간을 사용한다고 보시면 되겠죠?


아래의 코드를 볼까요?


이상이 없어보이지만, 컴파일 에러가 납니다.

눈치 채셨겠지만 int와 float형의 변수형 차이가 있어서 에러가 난 것입니다.

p 라는 실수형 공간에 x의 주소값을 넣는다고 하더라도 형을 지켜주셔야 합니다.

 - 단순히 주소값이 들어간다고 해서 아무 변수나 쓴다면 그것 또한 아니된다 라는 말씀!

'Programming Language > C/C++' 카테고리의 다른 글

C++ 인라인 함수  (0) 2014.10.10
C 배열과 포인터  (0) 2014.10.10
C 삼항연산자  (0) 2014.10.09
C 비트연산자  (0) 2014.10.09
Release모드에서 디버깅하기  (0) 2014.05.13
Posted by 긍정왕오킹