[C언어] 포인터 기본적인 사용으로 이해하고, 초기화 방법 알기

    포인터 이해하기 

    C언어는 포인터를 이용해 메모리에 직접 접근이 가능하다 그래서 Love레벨 언어의 특성을 가진다고 말한다. 


    메모리에 직접 접근이 가능하게 하려면 주소값을 저장할 변수가 필요한데 이것이 포인터 변수이다.  다음 코드를 보며 이해 해보자


    #include<stdio.h>
     
    int main(void){
        
        int num = 7;
        int * pnum;
        pnum = &num;
     
        return 0;
    }
    cs


    int * pnum 이 바로 주소값을 저장할 포인터 변수이다. pnum은 변수명이고 int는 int형 변수의 주소값을 저장한다는 것이다.

    pnum = &num에서 &num은 num의 주소값이고 이 값을 pnum에 대입한 것이다.


    &연산자는 피 연산자의 주소값을 반환하는 연산자이다.


    저 위에코드를 한줄로 표현하면 "포인터 변수 pnum이 int형 변수 num을 가리킨다." 라고 표현 할 수 있다.


    포인터 변수의 크기는 32비트 시스템에는 4바이트가 될 수 있고 64비트 시스템에서는 8바이트가 될 수도 있다. 이렇듯 포인터 변수의 크기가 주소 값의 크

    기와 일치해야 주소 값을 저장할 수있다. 따라서 주소 값의 크기와 포인터 변수의 크기가 동일 한 것은 당연하다.



    포인터 변수 선언의 기본 공식과, 자료형


    type * ptr; 
    cs

    type형 변수의 주소 값을 저장하는 포인터 변수 ptr의 선언


    포인터 변수는 단순히 주소값을 저장하는 변수인데 자료형이 있다는 것은 자신이 가리키고 있는 변수의 타입을 뜻하는 것이다. 단순히 주소값을 아는 것은 필요가 없다 주소를 통해서 데이터를 이용하는것이 목적이다. 주소값은 10진수나 16진수등 자신이 원하는 진법으로 볼 수 있다. 



    포인터 연산자
    포인터 연산자는 *, & 로 분류할 수 있는데 *는 보통 곱셈 연산식으로 쓰인다 하지만 단항 으로 쓰일때는 포인터 연산자라고 생각하고 있어야 한다. 
    &연산자는 앞서 말했듯이 주소를 반환해주는 단항 연산자이다. 

    기본적으로 * 연산자는 포인터가 가리키는 메모리를 참조하는 연산자이다

    #include <stdio.h>
     
    int main() {
        
        int num = 7;
        int * pnum;
        pnum = &num;
     
        printf("pnum : %d\n", pnum);
        printf("*pnum : %d\n"*pnum);
     
        return 0;
    }
    cs


    pnum은 num의 주소값이다. 하지만 *pnum을 찍었더니 num의 값이 나온다, 즉 *연산자는 포인터가 가리키는 값이된다.


    그림을 보면서 다시 설명하자면 pnum은 num의 주소값을 가지고 있고 *pnum을 출력하면 자신이 가리키고 있는 데이터가 나오는 것이다.  자료형도 이 데이터에 맞춰져 있는 것이다. 그러면 * 연산자를 이용하여 num의 값을 바꿀 수 있다.


    #include <stdio.h>
     
    int main() {
        
        int num = 7;
        int * pnum;
        pnum = &num;
     
        printf("pnum : %d\n", pnum);
        printf("*pnum : %d\n"*pnum);
     
        *pnum = 10;
        printf("num : %d\n", num);
     
        return 0;
    }
    cs


    포인터는 주소를 이용하여 사용하기 때문에 참조형 변수라고 할 수 있다. 그래서 *pnum은 자신이 가리키고 있는 데이터이고 *pnum의 값을 바꿔서 num의 값을 바꿀 수 있다. 


    정리한 바에 의해 *pnum의 의미를 이렇게 설명할 수 있다.


    "포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 접근"



    포인터 변수 초기화 방법

    포인터 변수도 똑같은 변수이기 때문에 선언만하고 초기화하지 않으면, 포인터 변수는 쓰레기 값으로 초기화된다. 그렇다고 아무값이나 대입하면 치명적인 결과로 이어질 수도 있다. 만약 *ptr 에 200을 대입했다고 치자 주소 200번지에 머가 있을지 모른다. 만약 가리키는 곳이 메모리 공간에서 매우 중요한 위치였다면 시스템 전체에 치명적인 문제를 일으킬수 있지만 다행이도 미연에 방지해준다. 그래서 포인터 값이 초기화는 0이나, null로 해줘야 한다.


    #include <stdio.h>
     
    int main() {
        
        int * ptr1 = 0;
        int * ptr2 = NULL;
        return 0;
    }
    cs


    위에서 ptr1을 초기화하는 값 0을 가리켜 '널 포인터'라 한다. 이는 0번지를 위미하는 것이 아니다. 이것이 의미하는 바는 "아무데도 가리키지 않는다!" 이다. ptr2도 NULL로 초기화 하몄지만 실제로도 이는 상수 0으로 정의되어 있다. 


    윤성우, 열혈 C프로그래밍, ORANGE MEDIA

    댓글

    Designed by JB FACTORY