본문 바로가기
2012.08.22 19:57

포인터

조회 수 4214 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

포인터는 말 그대로 메모리의 위치를 가리킨다. 변수 생성시 변수이름을 foo라 하고 값을 123이라 했을 때, foo를 가리키는 포인터를 설정하면 해당하는 값에 간접접근할 수 있다. 이를 123값을 가진 변수 foo를 가리키는 정수형 포인터라 한다.


  1. int foo = 123; // This is an integer variable  
  2. int *ptr = &foo; // This is a pointer to an integer variable  

http://etermoon.tistory.com/27


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


List of Articles
번호 제목 글쓴이 날짜 조회 수
21 Cocoa Programming 정리 08 - NSArrayController file Hojung 2013.02.25 5992
20 Cocoa Programming 정리 07 - Key-Value Coding 과 Key-Value Observing file Hojung 2013.02.20 5171
19 Cocoa Programming 정리 06 - 헬퍼 객체 file Hojung 2013.02.19 7567
18 Cocoa Programming 정리 05 - 타겟(Target)과 액션(Action) file Hojung 2013.02.14 6474
17 Cocoa Programming 정리 04 - 메모리 관리 file Hojung 2013.02.13 6371
16 Cocoa Programming 정리 03 - Objective-C file Hojung 2013.02.08 6136
15 Cocoa Programming 정리 02 - 시작하기 file Hojung 2013.02.05 8681
14 Cocoa Programming 정리 01 - Cocoa란? Hojung 2013.02.05 4866
13 객체 변수 선언시 @private 사용 Hojung 2012.09.18 4360
12 테스트 코드 작성 Hojung 2012.08.22 4103
11 NSString 객체의 생성과 변환 Hojung 2012.08.22 5166
10 클래스 프로퍼티 설정 Hojung 2012.08.22 4148
9 클래스와 객체 - 1 Hojung 2012.08.22 4236
8 Interface and Implementation Hojung 2012.08.22 3910
7 Extends vs Implements의 개념과 차이점 - 2 Hojung 2012.08.22 4319
6 Extends vs Implements의 개념과 차이점 - 1 Hojung 2012.08.22 4947
» 포인터 Hojung 2012.08.22 4214
4 조건문 및 순환문 Hojung 2012.08.22 4374
3 변수형 및 객체형 Hojung 2012.08.22 4360
2 hello world Hojung 2012.08.22 4182
Board Pagination ‹ Prev 1 2 Next ›
/ 2

Designed by sketchbooks.co.kr / sketchbook5 board skin

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5