#include <stdio.h>
void swap1(int, int); // call by value
void swap2(int*, int*); // call by reference
int main(void)
{
int a = 5, b = 8;
printf("a = %d, b = %d\n", a, b);
swap1(a, b); // 값에 의한 호출
printf("a = %d, b = %d\n", a, b);
swap2(&a, &b); // 참조에 의한 호출
printf("a = %d, b = %d\n", a, b);
return 0;
}
void swap1(int a, int b)
{
int temp = a;
a = b;
b = temp;
}
void swap2(int* a, int* b)
{
int temp = *a; // temp 변수에 a가 가리키는 곳의 값을 대입
*a = *b; // a가 가리키는 곳의 값에 b가 가리키는 곳의 값을 대입
*b = temp; // b가 가리키는 곳의 값에 temp의 값을 대입
// 주소값을 이용해 값에 직접 접근할 수 있다.
}
위 코드에서 swap1 함수를 실행시키면 main함수의 a,b값이 바뀌지 않는다.
그 이유는, swap1함수에서 인수로 받은 a,b에 main함수의 a,b값이 복사되고, swap1함수의 a,b만 바뀌기 때문이다.
(main함수의 a,b와 swap1함수의 a,b는 주소값이 다르기 때문에(다른 변수이기 때문에), main함수의 a,b 값이 전혀 변경되지 않는다.)
그러나 swap2 함수를 실행시키면 main함수의 a,b 값이 바뀐다.
그것은 swap2함수를 호출할 때 주소값을 매개변수로 전달해서, swap2 함수의 포인터 변수에 주소값을 저장하기 때문이다. 이렇게 되면 swap2함수의 포인터 변수로 main함수의 a,b값에 직접 접근할 수 있고, 당연하게 main함수의 a,b값을 바꿀 수 있다.
swap1함수는 값에 의한 호출로 a,b값이 바뀌지 않지만, swap2함수는 참조(주소로 전달하고 포인터로 참조)에 의한 호출로 a,b 값이 바뀐다.
이런 원리로 전역변수를 쓰지 않아도 다른 함수의 값을 바꿀 수 있다.
그리고 이런 상황에서 포인터 변수는 빛을 발한다.
반응형