소프트웨어/C 언어

[C언어]30. 메모리를 직접 관리하는, 포인터에 대하여 알아보자 ( 포인터 변수의 종류 )

리습 2013. 9. 5. 11:50


 안녕하십니까. 리습입니다.


 포인터라는것은 메모리 주소값을 저장하는 특수한 변수이며 그 타입은 어느 메모리 크기 만큼 접근할 것인가 에 대한 선언이라고 하였습니다. 포인터를 선언하고 사용하는 법은 알았으니 이제 변수의 종류에 대하여 알아보도록 하겠습니다.


 포인터 변수의 종류 


 포인터 변수의 종류는 일반 변수의 종류와 모양과 크기가 같습니다. 단 지니고 있는 의미만 다른 것이지요. 간단하게 표를 한번 보도록 하겠습니다.


 이름 ( * 는 포인터란 의미)

메모리에 접근할 때 크기

기타 

char *

1byte 


short *

2byte

 

float *

4byte

 

long *

4byte

 

int *

4byte

 

double *

8byte

 

*이 표는 32bit를 기준으로 작성되었습니다. 64bit운영체제 의 경우 위 크기는 달라집니다. 


 위 표를 전에 한번 보셨을 것입니다. [C언어]04. 기억을 할수 있는 공간. 변수에 대하여 알아보자 에서 변수의 종류와 크기를 나타내는 표였습니다. 이 표은 '포인터'에서도 유효합니다. 단 포인터에선 위 표의 크기만큼 포인터 변수가 공간을 접근 할수 있다는 것이 차이점이지요.  하지만 혼동하시면 안되는 것이 '모든 포인터 변수의 크기는 4byte( 32bit 운영체제 기준, 64bit에선 8byte) 이라는 것' 입니다.


 예를 한번 들어보겠습니다. 만약 char 형태로 포인터를 만든다면 이 포인터는 메모리 주소를 저장할수 있게 되며 이 포인터를 이용하여 메모리 주소에 접근하게되면 우리는 1byte 를 단위로 메모리에 접근하게 됩니다.  short 라면 2byte , int 라면 4byte 인것이지요. 


 한번 그러면 포인터 변수가 가지고 있는 크기가 어떻게 되는지 간단한 코드를 통해서 실험해보도록 하겠습니다.



 코드 

  #include <stdio.h>

  int main( void )

 {

      /* 포인터 변수 만듬*/

      char *ptr1; // char 타입의 포인터 변수

      short *ptr2; // short 타입의 포인터 변수

      float *ptr3; // float 타입의 포인터 변수

      long *ptr4; // long 타입의 포인터 변수

      int *ptr5; // int 타입의 포인터 변수

      double *ptr6; // doulbe 타입의 포인터 변수


      /*포인터 변수의 크기 비교 (sizeof 연산자 사용)*/

     printf("char ptr1 의 크기 : %d , 접근하는 크기: %d 입니다.\n", sizeof(ptr1), sizeof(*ptr1));

     printf("short ptr2 의 크기 : %d , 접근하는 크기: %d 입니다.\n", sizeof(ptr2), sizeof(*ptr2));

     printf("float ptr3 의 크기 : %d , 접근하는 크기: %d 입니다.\n", sizeof(ptr3), sizeof(*ptr3));

     printf("long ptr4 의 크기 : %d , 접근하는 크기: %d 입니다.\n", sizeof(ptr4), sizeof(*ptr4));

     printf("int ptr5 의 크기 : %d , 접근하는 크기: %d 입니다.\n", sizeof(ptr5), sizeof(*ptr5));

     printf("double ptr6 의 크기 : %d , 접근하는 크기: %d 입니다.\n", sizeof(ptr6), sizeof(*ptr6));

   

     return 0;

}


    

 결과

 char ptr1 의 크기 : 4 , 접근하는 크기 1 입니다.

 short ptr2 의 크기 : 4 , 접근하는 크기 2 입니다.

 float ptr3 의 크기 : 4 , 접근하는 크기 4 입니다.

 long ptr4 의 크기 : 4 , 접근하는 크기 4 입니다.

 int ptr5 의 크기 : 4 , 접근하는 크기 4 입니다.

 double ptr6 의 크기 : 4 , 접근하는 크기 8 입니다.


 포인터 변수의 종류와 실제 크기와 접근 크기에 대하여 알아보았습니다. 모든 포인터의 크기는 같으며 각 변수들의 차이는 어느정도의 메모리 크기에 접근하냐 라는 것입니다. 물론 int 값에 올바르게 접근하기 위해선 int 값을 써야합니다. 이런것들 때문에 몇몇 C언어 책에선 '포인터 변수의 형태는 참조(접근)하는 변수의 형태와 같아야만 한다.' 라고 설명하는 경우도 있습니다. 하지만 이것은 옳은 설명이 아닙니다. 포인터의 변수는 자유롭게 사용하면 됩니다. 포인터는 한단계씩 알아가야 덜 혼동이 오기때문에 변수의 종류까지만 확실히 하도록 하겠습니다.