ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 포인터 연산 (Pointer arithmetic)
    Visual Studio/C 기초 2012. 9. 5. 12:07

    이번엔 포인터 연산에 대해 포스팅 하겠습니다. 지난 번에 배열과 포인터를 한 번에 다뤘죠? 포인터는 배열에 저장되는 데이터형의 크기만큼 증가합니다. 그럼 포인터를 사용하여 어떻게 배열의 모든 요소를 사용할 수 있을까요? 포인터 연산을 사용하면 가능합니다.

    어려울 것 같지만 아주 간단하고 프로그램 내에서 포인터를 더욱 쉽게 사용할 수 있도록 도와주는 것이라 전혀 걱정할 필요가 없습니다^^

    포인터 연산엔 증감을 수행하는 두 가지 동작이 존재합니다.

    포인터의 증가와 감소

    배열을 가리키는 포인터가 있을 때 포인터 연산을 통해 포인터의 값을 1 증가시키면 포인터는 자동으로 배열의 다음 요소를 가리키게 됩니다. 즉, C언어는 포인터의 선언을 통해 포인터가 가리키는 데이터형을 알게 되므로 데이터형의 크기에 따라 포인터에 저장된 주소값을 증가시킵니다.

    int array1[5];

    int *pnt_to_array; 

    예를 들어, 이 포인터가 위의 배열 중 한 요소를 가리키는 포인터 변수라고 가정해봅시다. 만약 pnt_to_array++; 라고 적는다면, pnt_to_array의 값은 일반적으로 2바이트 또는 4바이트를 차지하는 int형의 크기만큼 증가하므로 pnt_to_int는 이제 그 다음 요소를 가리키게 됩니다. 만약 float형 배열의 요소를 가리킨다면 4바이트를 차지하는 만큼의 다음 배열의 요소를 가리킵니다.

    pnt_to_int += 4;    // 여기서, 4값을 더했죠? 만약 정수형(int)이 2바이트라고 가정할 때 실제 포인터 변수의 값엔 8이 더해지게 되고 포인터는 현재의 위치에서 4번째 뒤에 있는 배열의 요소를 가리키게 됩니다. float형이 4바이트라고 가정할 때는 16이 더해지게 되겠죠?

    이번에 포인터 연산을 응용한 예제를 보여드리겠습니다.

     

     #include <stdio.h>

    int i_array[10]={0,1,2,3,4,5,6,7,8,9}; //정수 배열을 선언하고 초기화합니다.
    int *i_pnt, count;
    float f_array[10]={.0,.1,.2,.3,.4,.5,.6,.7,.8,.9}; //소수형 배열을 선언하고 초기화합니다.
    float *f_pnt;
    main(){
     i_pnt = i_array;
     f_pnt = f_array;
     for(count=0;count<10;count++)
      printf("\n%d\t%f",*i_pnt++,*f_pnt++);  //카운터 값이 증가할 수록 포인터는 다음 배열의 요소를 가리키는 구조입니다.
    }

    결과

     

     

    포인터 연산을 계산하는 방법은 여러가지 입니다. 한가지는 두 포인터간의 간격을 계산하는 차이계산입니다. 이 차이계산은 두 포인터간의 거리가 얼마나 되는지 알 수 있습니다. 예를들어 pnt1, pnt2라는 두 개의 포인터가 있습니다.

    pnt2 - pnt1 이렇게 쓰시면 됩니다.

    단, 동일한 배열의 요소를 가리키는 포인터에서만 유효합니다.대신 ==, !=, >, <, >=, <=를 정상적으로 사용할 수 있죠. 만약 pnt1이 pnt2보다 배열 내에서 앞에 존재한다면 pnt1< pnt2는 참입니다.

     

    다음엔 문자와 문자열에 대해 포스팅 하겠습니다.

    댓글

Designed by Tistory.