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
  • 그네고치기 2007.01.02 23:55 ADDR EDIT/DEL REPLY

    "누워서 읽는 알고리즘" (임백준) 에서는 MS의 입사 테스트에서 처음에 [포인터] 를 써서 설계하도록 만든 함수를 [포인터의 포인터]를 쓰도록 고치게 하는 내용도 나오지요. 포인터의 포인터의 포인터의 ... 포인터를 써보는 것도 재미있[...] 습니다. 언젠가 한번 무슨 소스코드를 최적화하느라 써봤는데... (대체 어떻게 포인터 중첩으로 최적화가 되는거지?) 머리 아프고 싶은 날에 하실만한 일로 강추천! (...)

    • snowall 2007.01.03 00:08 신고 EDIT/DEL

      포인터의 포인터는 저도 안 써봤습니다. 언젠가 쓸일이 있으면, 그때 이해하기로 하고 일단 넘어갔거든요;;

  • djinni 2007.06.14 17:57 ADDR EDIT/DEL REPLY

    포인터의 포인터... 딱 한번 SOLID MODELING 시에 쓰고는 절대 안씁니다.
    그 소스는 많은 주석과... 문서를 남겼음에도 불구하고 아무도 이해를 못하더군요.
    정확히 이야기하면 이해를 못한다기 보다는 이해하고픈 마음이 들지 않는 것이겠죠.
    물론 저도 그 소스가 어디에 있는지는 모르며 찾고 싶은 생각도 없답니다.
    필요하게 되면 다시 만들겠죠 (이번엔 보기 쉽게....)

    • snowall 2007.06.14 19:07 신고 EDIT/DEL

      저 "주소"와 실제 주소에 있는 "값"의 개념적 차이를 이해하는 것이 실제 생활에서도 나타납니다. 심지어 완전 추상 수학인 "호몰로지 대수학"에서도 나오죠.