IT/기타

[C] 포인터 개념

안경 쓴 귀니 2017. 2. 3. 18:03
반응형





# [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가 가진 주소값이나 같다는 걸 볼 수 있지.



[출처 : http://etermoon.tistory.com/27]


반응형