:: 이중 강의 :: 2011.04.02 23:25


* 과거에 내 나름대로 공부한 것을 비유와 설명을 곁들여서 정리하려 해. 그래서 나 말고 다른 사람이 보면 절대로 알 수가 없어. (읭?) 그래도 볼 사람이 있으면 보던지 말던지 마음대로 해. 워낙 부족한 실력이기 때문에 또 먼 훗날 보면 틀린 부분이 있을지도 모르겠어.



# [C] 포인터 - 기초 개념 설명

* 포인터는 빵을 먹기위한 일진의 처절한 사투를 다루는 이야기야. 무슨 말인지 모르니까 일단 예제를 보자.

int Bbang = 1000;
int *DD = &Bbang;

학교 매점 '메모리'에 int맛 Bbang이 새로 들어왔어. 오늘 그 빵을 1000원에 판데.
근데 학교 짱 DD가 "야, 저기 내가 가르키고 있는 int맛 Bbang 있는 진열대 보이지? 빵에다 별 찍어놨으니까 알아둬라."라고 선포했어.
위에 문장은 이해하려 하지말고 그냥 머리속에서 상황을 상상만 해. 그럼 이걸 다시 외계어로 친절하게 설명해줄께.

int Bbang = 1000;

먼저 int Bbang 이라고 선언하면 컴퓨터 메모리에 int형의 Bbang이라는 변수가 들어갈 메모리 공간이 잡혀.
그리고 그 공간에 1000이라는 값을 넣고 있는 걸 볼 수 있어. 
메모리 공간이 잡히게 되면 그 메모리 공간의 주소값이 있겠지? 일단 여기까지 알아두자.


int *DD = &Bbang;

이건 DD라는 포인터가 그 Bbang이 있는 주소(&)를 가르키겠다(*)는 거야.
여기서 별 표시를 빼면 그냥 변수가 되버리짆아? 그러니까 주소를 가르킨다는 의미를 갖기 위해서 포인터는 별* 표시를 하는거야. 

 자, 그리고 이렇게 선언한 이후부터는 조심해야 돼.
 왜냐하면 선언할때의 *표시와, 실제 사용할때의 *표시는 개념이 다르기 때문이지.

 이때부터는 그냥 DD가 누구냐? 라고 묻게되면 "난 Bbang의 주소값(진열대)을 가르키고 있어요"라는 거야. 주의해.
 즉, 주소가 아니라 1000이라는 값을 가르키고 싶다면 단순히 주소가 들어있는 DD가 아니라. *DD를 이용해야해
 *DD가 누구냐? 라고 해야지만 "난 주소값(진열대) 안에 있는 빵을 가르키고 있다"라고 되는거지.


그럼 예를 들어서 선언말고 사용할때의 *표시가 어떻게 다른지 볼까?
여기서 printf가 떳다고 치자. 두 가지 취조하는 것을 예를 들어 볼께.


printf("%d", DD);

이건 "DD야, 좋은 말로 할 때 니가 알고 있는 진열대 위치(주소)를 불어라." 라고 하는 거야.
Bbang가격이 어떻게 변하던 말던 그 빵은 계속 그 자리에 있기 때문에 이 메모리 주소값은 변하지 않아.


printf("%d", *DD);

이건 "DD야, 좋은 말로 할때 진열대 안에 니가 점찍어 둔거 얼만지 불어라" 라고 하는거야.
이 가격은 실제 Bbang 가격이 어떻게 변하냐에 따라서 변할 수 있어.



* 변수에 들어가 있는 데이터를 바꾸면 포인터는 어떻게 될까?

Bbang = 10000;

이라고 빵 가격을 바꿔도, DD는 계속 Bbang만 가르키고 있기 때문에 DD가 가르키고 있는 주소(진열대)는 전-혀 변하지 않겠지.
진열대는 그 위치에 그대로 있으니까. 이것이 바로 포인터의 가장 큰 특징이야.
물론 *DD라고 쳐서 진열대 안에 있는 빵까지 파고들면 빵이 만원으로 오른것까지 알 수 있겠지.



* 정리하자.

Bbang은 1000
&Bbang은 1000이라는 값이 들어 있는 메모리 주소값.
DD는 Bbang이 있는 주소값. 위의 &Bbang와 동일
*DD는 Bbang이 있는 주소값에 있는 데이터. 즉 1000. Bbang값과 동일.



* 아래는 코드야. 아마 이쪽으로 이해하는게 더 쉬울꺼야.

#include<stdio.h>

int main()
{
int Bbang = 1000; // 빵값 1000원
int *DD = &Bbang; // 빵이 있는 주소값을 DD포인터에 저장.

printf("빵값 : %d\n", Bbang); // 빵값 프린트
printf("빵주소 : %d\n", &Bbang); // 빵이 있는 주소를 프린트
printf("DD가 가르키고 있는 빵의 주소 : %d\n", DD); // DD포인터가 가르키고 있는 빵의 주소를 프린트.
printf("DD가 가르키고 있는 빵의 실제 가격 : %d\n\n", *DD); // DD포인터가 가르키고 있는 빵의 주소안에 있는 데이터를 프린트.

Bbang = 10000; // 이때 빵 가격 상승.

printf("빵값 : %d\n", Bbang); // 빵값 프린트
printf("빵주소 : %d\n", &Bbang); // 빵이 있는 주소를 프린트
printf("DD가 가르키고 있는 빵의 주소 : %d\n", DD); // DD포인터가 가르키고 있는 빵의 주소를 프린트.
printf("DD가 가르키고 있는 빵의 실제 가격 : %d\n\n", *DD); // DD포인터가 가르키고 있는 빵의 주소안에 있는 데이터를 프린트.

return 0;
}

결과값과 코드에 적힌 주석을 비교해가면 보면 확실하게 이해가 갈꺼야.

보통 주소값은 %d로 표현시 7자리 숫자로 표현되는데 컴퓨터마다 자릿수가 틀릴수도 있고, 돌릴때마다 주소값이 바뀌는건 정상이니까 걱정하지마. 중요한건 매 결과값에서 보이는 주소값은 모두 똑같다는거야. 실제로 출력해보면 Bbang 변수의 주소값이나 그걸 가르키는 포인터 DD가 가진 주소값이나 같다는 걸 볼 수 있지.

포인터가 뭔지 (내 글을 보면 알뻔한 것도 머리가 포멧되버려서 모르겠지만) 대충 알았으니 다음에 시간이 나면 왜 포인터를 쓰는지, 실제 활용사례를 간단하게 들어볼께. 

':: 이중 강의 ::' 카테고리의 다른 글

[C] 포인터 - 기초 개념 설명  (9) 2011.04.02
밴디트  (0) 2011.01.08
분자, 원자, 원소의 개념을 확실하게 잡아주마!  (16) 2010.06.06
Posted by 이터문
TAG ,

댓글을 달아 주세요

  1. 입문 2011.04.26 11:13 신고  댓글주소  수정/삭제  댓글쓰기

    와 정말 알기 쉽게 설명해 주셨네요 ㅋ 감사합니다

  2. 초보 2011.10.18 00:59 신고  댓글주소  수정/삭제  댓글쓰기

    강의시간에 교수님 설명 들을 땐 이해안가던게
    님이 빵에 비유해서 설명해주신 글 보고 한방에 이해갔어요ㅋㅋㅋㅋ
    고맙습니다!

  3. zzzz 2012.01.10 11:55 신고  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋㅋㅋ 지나가다가 웃겨서 남깁니다.
    지데로 설명해놨네요

  4. C입문자 2012.07.02 13:37 신고  댓글주소  수정/삭제  댓글쓰기

    C포인터 검색하다 들어와서 봤는데
    쉽고 재미 있는 설명에 Bbang떠져서 갑니다 ㅎㅎ

  5. cc 2012.12.06 14:34 신고  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다.

  6. 션쇼행성 2013.05.21 17:53 신고  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다. 설명 잘하셨네요^^

  7. 신주헌 2013.05.26 18:26 신고  댓글주소  수정/삭제  댓글쓰기

    설명잘하셨네요 자주들릴께요

  8. 굿 2014.01.13 16:02 신고  댓글주소  수정/삭제  댓글쓰기

    이해하기 쉽게 설명하셨네요 감사합니다 ㅋㅋ

  9. 윤성 2015.10.23 14:42 신고  댓글주소  수정/삭제  댓글쓰기

    와 죽여줍니다 레알 감사요 공부하는중에 포인터때문에 머리터질뻔햇는데 오 ㅏ 소름 ㅠㅠㄳㄳ