포인터
이해하기도 어렵고 악명높은 포인터에 대해 이야기해보도록 하겠습니다.
사전적 의미로는
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 |