티스토리 뷰

목차

    반응형

    C언어 포인터 이해하기


    최근 JAVA나 C# 같은 언어는 GC 기능이 메모리 관리할 필요가 없습니다.

    하지만 OS 내장 프로그램을 만들고 싶을 때 피할 수 없는 것이 C언어입니다.


    다른 프로그래밍 언어를 배우거나 배운 분들에게 낯설고 때로는 불쾌한 기분도 들게 만드는 게 C언어 포인터입니다. C언어를 배우려면 다른 언어에는 없는 포인터는 꼭 이해할 필요가 있습니다.


    한 눈에 확인하는 포인터와 연산자 - C++ 포인터도 똑같은 개념


    포인터 배우기 전에


    포인터 배우기 전에 pointer를 이해하는데 필요한 것이 하나 있습니다.


    바로 주소입니다.

    더 쉽게 말하자면 메모리 장소(위치)입니다.


    프로그램을 작성할 때 변수 등을 선언하면 해당 변수는 데이터 형식에 따라 필요한 만큼 메모리 위치(크기)를 확보합니다.

    이점은 C언어뿐만 아니라 다른 언어도 마찬가지이므로 기억해 두시면 손해 볼 것은 없습니다.


    C언어에서 주소 위치는 변수 앞에 "&" 기호를 붙여 표현합니다. 덧붙여 &를 주소 연산자라고 부릅니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    int  main () 
        int a = 0;
        printf("변수 a의 주소는 % d"&a);
     
        return 0 ; 
    }
    cs


    포인터가 뭐야?


    주소가 나왔습니다. 왜 포인터 이야기하는데 주소가 나올까요?

    대답은 간단합니다. 주소 위치에 변수를 할당하기 때문입니다.


    그리고 주소를 저장하고 있는 변수를 "포인터 Pointer"라고 합니다.


    위 코드에서 변수 a의 주소는 &a로 표현했습니다. 이젠 주소를 나타내는 &a에 포인터를 대입해 봅시다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    int main()
        int a = 0
        int *pa ; // 포인터 선언 
     
        pa = &a; //이 포인터에 주소 할당
        *pa = 1// a의 주소에 1을 대입, 즉 a에 1을 대입하는 것
     
        return 0 ; 
    }
    cs



    간단합니다.


    위의 소스 코드처럼 변수 pa와 같이 포인터 선언을 합니다. 또한 "*"를 포인터 연산자라고 합니다.


    포인터를 선언한 후 주소를 대입해 봅시다.

    일반 콘솔 프로그램이라면 컴파일 오류 또는 경고가 발생합니다. 만약 exe 파일이 있다면 실행하지 마세요.


    정의되지 않은 pointer 에 값을 할당한다는 것은 매우 위험한 것으로 시스템 자체에 오류를 유발할 수 있습니다.


    NULL = 널


    포인터의 포인터 pointer of pointer

    재밌게도, 포인터의 포인터도 얻을 수 있습니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main()
    {
        int a = 0;
        int *pa;  // 포인터 선언 
        int **pp; // 포인터의 포인터 선언
     
        pp = &pa; // 이 포인터에 주소를 할당
        **pp = 1// 포인터의 주소 대입
        pa = &a;  // p의 주소에 1을 대입, 즉 a에 1을 대입
     
        return 0;
    }
    cs


    마지막으로


    포인터의 개념을 이해하셨나요?


    아직 이해가 안 된다면, Java를 예로 들어볼게요.

    자바 입장에서 말하자면 C언어 포인터는 참조와 비슷합니다.


    예를 들어 자바에서,



    1
    2
    3
    4
    int[] a = {1,2,3,4,5};
    int[] b;
     
    b=a;
    cs



    같은 코드를 작성한 것입니다.


    b = a에서 배열 a의 주소를 배열 b에 전달하므로 필연적으로 a, b는 같은 값을 보유합니다.


    그래서 어느 한쪽을 변경하면 다른 쪽도 변경됩니다.


    포인터는 이와 같은 개념입니다.


    포인터 개념 정리 및 이해하기


    C언어 공부 글 더보기

    마이크로프로세서 주소 지정 방식

    https://codingcoding.tistory.com/596


    Call by Reference, Vale, Address 차이

    https://codingcoding.tistory.com/866


    동적 메모리 할당 방법

    https://codingcoding.tistory.com/645


    정수형 변수 int 배우기

    https://codingcoding.tistory.com/704

    반응형