포인터 활용 - 변수 값 교환

1 minute read


두 변수의 값을 서로 바꾸는 함수

두 변수를 대입하면 서로 값이 바뀌는 함수를 만들어본다.
우선 말 그대로 코드로 옮겨본다.

#include <stdio.h>

void Swap(int _lhs, int _rhs);

int main()
{
  int lhs =  4, rhs = 6;
    
  Swap(lhs, rhs);

  printf("Swap Result: %d, %d\n", lhs, rhs);

  return 0;
}

void Swap(int _lhs, int _rhs)
{
    int tmp = _lhs;
    _lhs = _rhs;
    _rhs = tmp;
} 

코드만 봤을 때는 분명 함수에 넣어준 두 변수들의 값들이 바뀌는 결과를 기대했지만 출력결과 각 변수들의 값들은 변하지 않았다. 자세히 확인하기 위해서 함수내에서 출력을 해본다.

void Swap(int _lhs, int _rhs)
{
    printf("Before Swap: %d, %d\n", _lhs, _rhs);
    int tmp = _lhs;
    _lhs = _rhs;
    _rhs = tmp;
    printf("After Swap: %d, %d\n", _lhs, _rhs);
} 
// 출력결과
// Before Swap: 4, 6
// After Swap: 6, 4

함수는 문제없이 값이 변경되는걸 확인할 수 있다.

이런 문제가 생긴 이유는 변수를 매개변수로 받아올 때 생긴다.
매개변수로 변수를 받게 되면 함수는 그 변수의 값만을 복사해서 사용하게 된다. 따라서 함수내에서 복사한 값들은 문제없이 교환이 됐지만 당연하게도 변수에 저장된 값이 바뀌는 것은 아니다.

이렇게 외부에서 변수 자체의 값을 바꾸기 위해서는 포인터를 사용해야한다.


포인터를 사용해서 값 바꾸기

변수에 저장된 값에 접근하기 위해서는 포인터를 사용한다.

#include <stdio.h>

void Swap(int* _plhs, int* _prhs);

int main()
{
    int lhs = 4, rhs = 6;

    Swap(&lhs, &rhs);
    printf("Swap Result: %d, %d\n", lhs, rhs);
    
    return 0;
}

void Swap(int* _plhs, int* _prhs)
{
    int tmp = *_plhs;
    *_plhs = *_prhs;    
    *_prhs = tmp;
}

포인터를 매개변수로 받기 때문에 변수에 저장된 값을 복사해서 사용하는 것이 아니라 변수의 주소를 참조해 변수에 저장된 값에 접근하여 다룰 수 있게 된다.