본문 바로가기

Language/_C

포인터(Pointer)

포인터 : 메모리의 주소 값(시작 주소)을 저장하기(가리키기) 위한 4바이트 변수
            (참고 : 포인터의 크기가 4바이트인 이유는 32비트 컴퓨터의 주소체계가 32비트(4바이트)이기 때문이다)



포인터 선언 :

int *pa;      // int형의 pa 이름의 포인터
(참고 : 변수명에 포인터임을 나타내기 위해 접두사로 포인터의 약자 p를 붙인다.
          ex. 변수 a를 가리키기 위한 포인터 : pa)

즉, int 형 변수의 메모리 주소를 가리키는 pa 포인터 (따라서 시작주소로부터 4바이트까지 참조한다)



주소 연산( & , * ) :

& : 주소값
* : 해당주소의 값 참조



예)

1. int i = 5;
2. int *pi = &i;
3. printf("%d %d", i, &i);
4. printf("%d %d %d", pi, &pi, *pi);

                                                               <메모리 상태>


설명 :

1번째줄 : int i 이므로   int 형의 i 변수가 메모리에 할당한다.
          int 이므로 4바이트의 메모리가 할당된다.(0012FF60 ~ 0012FF63  메모리 주소)
          4바이트에 걸쳐 5가 저장된다.  (즉, 0012FF60 만 참고하면 5라는 숫자를 얻을수 없다)

2번째줄 : int *pi 이므로 int 형의 변수를 가리키는 포인터 pi 변수를 메모리에 할당한다.
          포인터이므로 4바이트의 메모리가 할당된다.(0012FF54 ~ 0012FF57 메모리 주소)
          int *pi = &i  이므로 포인터 pi 변수에 변수 i 의 메모리 시작주소 0012FF60을 저장한다.
          포인터 pi 는 int 형이므로 값을 참조할 때 0012FF60 부터 4바이트를 더해 0012FF63까지 참조한다.

3번째줄 : printf("%d %d", i, &i);
             실행결과 : 5     0012FF60
             i 의 값은 5이므로 5가 출력된다.
             &i 는 i 의 주소값을 의미하므로 0012FF60 이 출력된다.

4번째줄 : printf("%d %d %d", pi, &pi, *pi);
             실행결과 : 0012FF60,   0012FF54,    5
             pi 의 값은 pi = &i 였으므로 i 의 주소값 0012FF60 이 출력된다.
             &pi 의 값은 pi 의 주소값을 의미하므로 0012FF54 가 출력된다.
             *pi 의 값은 pi 가 가진 값을 참조하는데 pi 는 int 형 포인터 이므로 pi 가 가진값 0012FF60 부터 4바이트
             즉, 0012FF60 ~ 0012FF63 까지를 참조하여 5가 출력된다.

'Language > _C' 카테고리의 다른 글

1차원 배열(Array)  (2) 2010.05.04
반복문 (for, while)  (0) 2010.03.25
분기문 ( if, if - else, switch )  (0) 2010.03.20
자료형, 상수, 변수, 연산자  (1) 2010.03.16
C Hello World 출력  (3) 2010.03.13