본문 바로가기
카테고리 없음

[C] 포인터

by 자바지기 2021. 10. 19.
반응형

모르는 부분만 정리하기

 

포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다.

 

포인터 연산자에는 &, * 이 있다. 

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

2. * 연산자는 메모리 공간에 접근할 때 사용하는 연산자이다.

사용 예 : 

int main(void){

    int num = 5;

    int * pnum = #  // num의 주소 값을 반환해서 포인터 변수 pnum을 초기화

    *pnum  =20;  // pnum이 가리키는 변수에 20을 저장

...

}

 

포인터의 형은 메모리 공간을 참조하는 기준이 된다.

 

따라서 위의 예와 같이 접근하고자 하는 변수의 자료형과 포인터 변수의 자료형을 일치시켜야 한다.


Call-by-value : 값을 전달하는 형태의 함수 호출

Call-by-reference: 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수 호출


더블 포인터

  • 포인터의 포인터
  • 포인터 변수를 가리키는 또 다른 포인터 변수를 뜻한다.

더블 포인터 또한 주소 값을 저장하는 변수이다.

즉 포인터 변수의 주소를 가리키는 변수이다.

 

더블 포인터가 쓰이는 이유?

제일 헷갈리는 부분이다.

먼저 포인터 변수 대상의 call-by-reference를 살펴보자

# include <stdio.h>

void SwapIntPtr(int *p1, int *p2){
    int *temp = p1;
    p1=p2;
    p2=temp;
}

int main(void){

    int num1 = 10;
    int num2 = 20;

    int *ptr1, *ptr2;
    ptr1 = &num1;
    ptr2 = &num2;
    
    SwapIntPtr(ptr1, ptr2);  
    
    printf("*ptr1, *ptr2 = %d, %d", *ptr1, *ptr2);
    
    return 0;
}

위의 예제 코드의 결과는 *ptr1, *ptr2 = 10, 20으로 SwapIntPtr을 거쳐도 두 값이 Swap 되지는 않을 것이다.

 

왜 이런 것일까?

이유는 p1과 ptr1은 별개이고 p2와 ptr2는 별개이기 때문이다.

SwapIntPtr 함수를 통해서 p1과 p2의 값은 서로 교환이 될 것이다.

그러나 그것은 ptr1과 ptr2 와는 무관하다.

ptr1과  ptr2가 서로 교환이 되기 위해서는 ptr1과 ptr2에 저장된 값을 바꿔야 한다.(p1, p2에 저장된 값이 아닌)

 

이러한 이유로 더블 포인터를 사용해야한다.

위의 예제 코드를 다음과 같이 수정한다.

 

# include <stdio.h>

void SwapIntPtr(int **dp1, int **dp2){
    int *temp = *dp1;
    *dp1=*dp2;
    *dp2=temp;
}

int main(void){

    int num1 = 10;
    int num2 = 20;

    int *ptr1, *ptr2;
    ptr1 = &num1;
    ptr2 = &num2;
    
    SwapIntPtr(&ptr1, &ptr2);  
    
    printf("*ptr1, *ptr2 = %d, %d", *ptr1, *ptr2);
    
    return 0;
}

이번에는 SwapIntPtr의 인자로 ptr1의 주소 값과 ptr2의 주소 값을 넣어 주었다.

그리고 SwapIntPtr 함수 내에서 주소 값에 해당하는 변수에 저장된 값을 교환하였다.

즉 ptr1과 ptr2를 직접 교환하였다고 생각하면 이해하기 쉽다.

SwapIntPtr가 끝나면 ptr1에는 ptr2에 있던 num2의 주소 값이,

ptr2에는 ptr1에 있던 num1의 주소 값이 들어가 있을 것이다.

 

반응형

댓글