티스토리 뷰

Programming/C언어

[C/C++] 포인터에 대한 이해

Lkt_Programmer 2017. 10. 2. 21:48
반응형

포인터


포인터란 메모리의 주소 값을 저장하기 위한 변수로, 기본 자료형 변수와는 달리 메모리 공간의 주소 값을 저장하는데 사용되는 변수를 의미하는 것입니다. 포인터가 변수라는 것을 강조하기 위해 '포인터 변수'라는 표현을 많이 사용합니다.



포인터 선언하기



1
2
3
4
5
6
main (void)
    int *a;             //a라는 이름의 int형 포인터
    char *ch;        //ch라는 이름의 char형 포인터
    double *d;      //d라는 이름의 double형 포인터
}


포인터를 선언 할 때는 변수명 앞에 *연산자를 사용함으로써 선언이 가능합니다.


● int *a : int형 변수의 주소 값을 가질 수 있는 int형 포인터

● char *ch : char형 변수의 주소 값을 가질 수 있는 char형 포인터

● double *d : double형 변수의 주소 값을 지닐 수 있는 double형 포인터


&연산자와 *연산자



1
2
3
4
5
6
main (void)
    int num = 500;                       //int형 변수 num에 500을 할당
    int* point_num = #         // int형 포인터 변수에 num의 주소값 할당
    printf("%d", *point_num);     //point_num이 가르키는 주소가 가지는 변수의 값 출력
}
&는 주소 값을 구할 때 사용하는 연산자로 포인터 변수 point_num에 num변수의 주소 값을 대입하고 있습니다. 
*연산자는 포인터가 가르키고 있는 변수의 값을 출력 할 때 사용합니다.

이렇듯 num 변수의 값에 접근하기 위한 방식으로 num 변수를 통해 직접 접근(Direct Access)과 포인터 변수를 통한 접근 방식인 간접 접근(Indirect Access)방식이 있습니다.

포인터에 다양한 타입이 있는 이유


1
2
3
4
5
6
7
8
9
10
main (void)
    int num = 500;                     
    int* point_num = #
    
    double num2 = 3.14;
    double* point_num2 = &num2;     
     
    printf("%d %f", *point_num,*point_num2);     
}

int형 포인터 변수와 double형 포인터 변수에 각각 num의 주소와 num2의 주소를 할당하고 있습니다. 그리고 9Line에서 *연산자를 통해 값을 읽어 들일려고 합니다. 이때 바로 포인터 타입을 사용합니다. *point_num을 실행하게 되면 point_num은 int형 포인터이므로 해당 주소에서 총 4바이트를 읽어들입니다. 반면에 point_num2는 double형으로 해당 주소에서 총 8바이트를 읽어들이게 됩니다.


만약 포인터에 타입이라는 것이 존재하지 않는다면, 포인터를 이용해서 변수를 참조하는 경우 몇 바이트를 읽어들여야 할지 알수 없게 됩니다. 즉 포인터의 타입은 메모리를 참조하는 방법을 알려주는 역할을 수행합니다.



반응형