ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터 연산
    프로그래밍/C, C++ 2019. 4. 17. 00:00

    포인터 연산

    포인터 변수가 지원하는 사칙연산은 더하기와 빼기 밖에 안됩니다.
    곱하기나 나누기를 쓸 경우, 에러를 발생합니다!

    #include <stdio.h>
    
    int main(){
        int a = 10;
        int *ptr = &a;
        ptr++; ptr--;
        // ptr *= 2; Error!
        //ptr /= 2; Error!
    }

    그리고 더하기, 빼기 연산의 결과는 포인터가 가리키고 있는 변수의 크기 만큼 증가하거나 감소한다!
    아래의 예제에서 보면 이해할 수 있을 것이담

    #include <stdio.h>
    
    int main(){
        int a = 10;
        int *ptr = &a;
        printf("ptr : %x, ptr + 1 : %x\n", ptr, ptr+1);
    
        int arr[4] = {1,2,3,4};
        int (*ptrArr)[4] = &arr; 
        printf("ptrArr : %x, ptrArr + 1 :%x\n", ptrArr, ptrArr + 1);
    
    }

    실행결과

    ptr : 62fe0c, ptr + 1 : 62fe10 // 차이 : 4
    ptrArr : 62fe10, ptrArr + 1 :62fe20 // 차이 : 16


    위의 결과를 그림으로 표현하면 아래와 같다

    ptr이 가리키고 있는건 int 변수입니다. 따라서 int의 크기인 4 바이트만큼 포인터가 증가함을 알 수 있습니다


    그 아래 있는 int arr[4]와 int (*ptrArr)[4]의 메모리 구조를 그림으로 보면 아래와 같습니다.

    ptrArr 이 가리키고 있는건 int [4]입니다.
    따라서 더하기 연산을 할 시, sizeof(int) * 4 인 16바이트만큼 증가함을 볼 수 있습니다.


    포인터끼리의 연산

    같은 포인터끼리는 연산을 할 수 있습니다. 자료형이 다른 포인터끼리는 연산 시 에러를 발생합니다.
    곱하기, 나누기, 더하기는 할 수 없고, 오직 빼기만 사용할 수 있습니다.


    연산 결과는 주소간의 차이가 아니라, (주소 차이) / (포인터가 가리키고 있는 변수의 크기)이다

    #include <stdio.h>
    
    int main(){
        int a = 10;
        int *ptr = &a;
        double d = 10;
        double *dptr = &d;
        // printf("%d\n", dptr-ptr); double * 과 int *은 서로 연산 할 수 없다.
        int arr[4] = {1,2,3,4};
        int (*ptrArr)[4] = &arr; // ptrArr은 int [4] 을 가리키는 포인터
        int (*ptrArr1)[4] = ptrArr + 3;
        int (*ptrArr2)[4] = ptrArr - 2;
    
        printf("ptrArr1 - ptrArr : %d\n", ptrArr1 - ptrArr);
        printf("ptrArr2 - ptrArr1 : %d\n", ptrArr2 - ptrArr1);
    }

    실행결과

    ptrArr1 - ptrArr : 3 // 주소값이 48바이트 차이난다고 48이 아니라, 48 / 16 = 3
    ptrArr2 - ptrArr1 : -5 // -80 / 16 = -5



    틀린 부분이나 궁금한 건 댓글 달아주시면 감사하겠습니다 :)

    '프로그래밍 > C, C++' 카테고리의 다른 글

    포인터 타입 캐스팅  (0) 2019.04.30
    함수 포인터  (0) 2019.04.26
    포인터와 배열1  (0) 2019.04.21
    포인터와 배열2  (0) 2019.04.21
    포인터 기본  (0) 2019.04.16

    댓글

Designed by Tistory.