포인터 활용 - 변수 값 교환
두 변수의 값을 서로 바꾸는 함수
두 변수를 대입하면 서로 값이 바뀌는 함수를 만들어본다.
우선 말 그대로 코드로 옮겨본다.
#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;
}
포인터를 매개변수로 받기 때문에 변수에 저장된 값을 복사해서 사용하는 것이 아니라 변수의 주소를 참조해 변수에 저장된 값에 접근하여 다룰 수 있게 된다.