ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C Language] 35. 포인터 기초 - C 언어
    CSE/C Language 2015. 7. 20. 14:08

    1. 포인터란?

     포인터란 메모리의 위치를 기호화한 표현이다. 우리가 친구 집을 찾아가기 위해서는 주소가 필요한 것처럼 시스템에서도 특정한 값을 찾기 위해서는 주소가 필요하다. 실생활에서의 주소는 시, 도, 군등으로 나누지만 시스템에서는 4 바이트로 표시하도록 되어 있으며 일반적으로 다음과 같이 표기한다.


      0x4600F269


     상당히 기계적인 표현이라 정이 안가는 형태이지만 포인터를 정복하기 위한 가장 첫 걸음이므로 너무 거부감을 갖지말고 보자. 언젠가는 정감있는 표현으로 다가올 날이 있을 것이다. 0x 는 다음에 이어지는 표현이 16진수임을 뜻하고 연이은 8 자리 문자와 숫자의 조합은 주소 값을 의미한다. 16진수이기 때문에 숫자 중간에 A ~ F 까지의 문자가 올 수 있다. 우리는 흔히 자신의 컴퓨터 사양을 이야기할 때 256M, 512M로 이야기하는데 이것은 메모리의 크기를 말하는 것이다. M 은 1024 X 1024 byte를 뜻하므로 256M 의 메모리는 256 X 1024 X 1024 byte의 크기를 가진다. 즉, 268,435,456 byte를 저장할 수 있다는 말이 되므로 약 2 억개의 문자나 숫자를 저장할 수 있다. 




     아래 예제를 통해 변수의 할당 값, 메모리 주소, 크기를 알아보자.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /*
     * pointer.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int tmp = 777;
     
        printf("tmp에 저장된 값: %d\n", tmp);
        printf("tmp의 주소: %#x\n", &tmp);
        printf("tmp를 저장하기 위한 메모리 크기: %d\n"sizeof(tmp));
     
        return 0;
    }
     
    cs









    2. 포인터 변수

     포인터를 다루기 위해서는 맨 먼저 포인터 변수를 정의해야 한다. 포인터 변수란 포인터를 저장할 수 있는 변수를 말한다. int 형 변수는 정수를 저장하는 변수이다. 포인터 변수는 당연히 포인터를 저장하는 것이다. int 형에 float 형을 대입하면 문제가 발생하는 것 처럼 포인터 변수에 포인터 이외의 값을 넣으면 당연히 문제가 발생한다. 



     '포인터 변수에는 포인터(주소, 번지) 값 이외에는 절대 어떤 값도 들어갈 수 없다.'





    3. 포인터 변수의 정의

    포인터 변수를 정의하는 방법은 다른 변수를 정의하는 것과 크게 다르지 않다.


    1
    2
    3
    4
    5
    6
    int *int_p;
     
    char *char_p;
     
    float *float_p;
     
    cs



     정수형 변수, 문자형 변수, 실수형 변수의 앞에 '*' 만 붙여주면 그것이 곧 포인터 변수가 된다.






    4. 번지 연산자 &, *

     포인터 변수는 주소값 이외에는 할당되지 않는다고 했으므로 당연히 포인터 변수에 주소 값을 할당하는 방법이 있어야 할 것이다. 


     다음은 포인터 변수에 주소 값을 저장하는 예제이다.




    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    /*
     * pointer.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int tmp = 5;
        int *tmp_p;
     
        tmp_p = &tmp;
     
        printf("tmp = %d\n", tmp);
        printf("&tmp = %#x\n", &tmp);
        printf("tmp_p = %#x\n", tmp_p);
        printf("&tmp_p = %#x\n", &tmp_p);
        printf("*tmp_p = %d\n"*tmp_p);
     
        return 0;
    }
     
    cs











     & 번지 연산자

    변수 앞에 사용하여 그 변수가 저장된 메모리의 위치를 나타낸다.


    ex) &tmp: tmp가 저장된 곳의 위치를 나타낸다.



     * 번지 연산자

    포인터 변수 앞에 사용하여 포인터 변수에 저장된 번지 값을 참조한다.


    ex) *tmp: tmp안에 저장된 주소 값을 참조한다.





    5. 쓰레기 주소 값

     쓰레기 주소 값을 예제로 알아보자.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /*
     * pointer.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int *tmp_p;
     
        printf("tmp = %p\n", tmp_p);
     
        return 0;
    }
     
    cs








     포인터 변수는 안전한 위치를 저장할 때 의미가 있다. 그러므로 반드시 포인터 변수 선언 시 초기화를 해주어야 한다.






    6. 포인터 변수에 왜 형을 지정하는가?

     포인터 변수에 왜 형을 지정하는지 그 이유에 대해 알아보자.


    1
    2
    3
    4
    5
    6
    7
    int int_p;
     
    float float_p;
     
    double double_p;
     
    char char_p;
    cs



     다음은 변수를 정의한 예제이다. 시스템이 메모리에 어느 정도의 크기를 할당하는지 알아보기 위해 sizeof 연산자를 사용하였다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /*
     * pointer.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int int_p;
        short short_p;
        float float_p;
        double double_p;
        char char_p;
     
        printf("int = %d\n"sizeof(int_p));
        printf("short = %d\n"sizeof(short_p));
        printf("float = %d\n"sizeof(float_p));
        printf("double = %d\n"sizeof(double_p));
        printf("char_p = %d\n"sizeof(char_p));
     
        return 0;
    }
     
    cs








     변수는 저마다 메모리 할당 크기가 다르다. 저장되는 정보의 양이 다르기 때문이다. 그렇다면 포인터 변수는 어떨까?





    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    /*
     * pointer.c
     *
     *  Created on: 2015. 7. 19.
     *      Author: Yeonsu
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int *int_p;
        short *short_p;
        float *float_p;
        double *double_p;
        char *char_p;
     
        printf("int = %d\n"sizeof(int_p));
        printf("short = %d\n"sizeof(short_p));
        printf("float = %d\n"sizeof(float_p));
        printf("double = %d\n"sizeof(double_p));
        printf("char_p = %d\n"sizeof(char_p));
     
        return 0;
    }
     
    cs







     포인터 변수는 어떠한 형(type)을 지정하든 무조건 4바이트가 할당된다는 거을 알 수 있다.

    댓글

Designed by Tistory.