C언어를 배우면서 가장 헷갈렸던 건 포인터에 대한 개념이었다. 포인터는 메모리 주소를 알려준다는데, 대체 뭐냐 -_-;

이걸 쓰려면 &와 *를 알아야 한다.

포인터 이름을 p라고 하자.
그럼, 일단 선언을 해야한다.
int *p;
이러면 뭐가 되냐하면, p라는 이름이 붙은 정수형 변수가 선언된다. 하지만, 여기서 중요한건 그냥 p=1이라는 식으로 쓸 수가 없다는 것이다. 왜냐하면 p는 변수가 아니라 변수 이름이기 때문이다. 즉, 우리는 노트에 기록을 할 수는 있지만 노트를 기록할 수는 없는 것이다! [각주:1] 내가 p라는 변수에 뭔가를 기록하고 싶으면 *p를 써야 한다. 만약, p라는 변수의 주소가 필요하다면, &p가 바로 그 주소를 알려주는 역할을 한다. 일단 아래의 소스를 분석해보자. 내가 포인터 공부를 할 때 만든 소스를 좀 개조했다.
#include <stdio.h>
main()
{
    char a, b;
    char *deathnote;
   
    a=NiceGuy;
    deathnote=&a;
    b=*p;
   
    printf("1. a=%c, b=%c, *deathnote=%c \n", a, b, *deathnote);
    a=HandsomeGuy;
    b=BadGuy;
    printf("2. a=%c, b=%c, *deathnote=%c \n", a, b, *deathnote);
    deathnote=&b;
    printf("3. a=%c, b=%c, *deathnote=%c \n", a, b, *deathnote);
}
이 소스는 어떻게 작동할까? 일단, deathnote라는 포인터를 하나 만들었다. 즉, 표지에 deathnote라고 적힌 노트를 한권 마련한 것이다. 일단 a=NiceGuy라고 집어넣어놨다. 이제, deathnote=&a라고 하면 뭐가 될까? &a가 알려주는 것은 a가 있는 주소이다. 즉, deathnote라는 노트를 꺼내서 펼치는 것은 a라는 노트를 꺼내서 펼친 것과 같은 내용이 적혀있다는 거다. 좀 더 정확히 얘기하자면, deathnote=&a라고 적는 순간, a라는 공책은 deathnote가 된 것이다. 이제 a를 바꾸든 deathnote를 바꾸든 둘 다 동시에 바뀌게 된다. 즉, 하나의 메모리 영역이 두개의 이름을 갖게 된 것이다. 이제, deathnote에 적힌 내용을 사용하고 싶으면, *를 이용하면 된다. 즉, *deathnote라고 쓰면, 그것은 곧 deathnote에 적힌 내용을 알려주는 것이다.

자, 다음의 문장을 생각해 보는 것은 숙제이다.
포인터의 포인터를 사용할 수 있다.
물론 포인터의 포인터의 포인터 또한 사용할 수 있다.



  1. 노트를 기록하는게 불가능하지는 않다. 다른 노트에 적으면 되니까. 마찬가지로, 포인터의 포인터 역시 가능하다. [본문으로]
by snowall 2007. 1. 2. 21:56