C 언어에서 참조에 의한 호출(Call by Reference)이란?
참조에 의한 호출(Pass by Reference)은 함수를 호출할 때 값 자체가 아니라 변수의 주소(address)를 인수로 전달하는 방식을 말합니다.
참조에 의한 호출 방식에서는 실제 인수(actual argument)의 주소가 함수의 형식 매개변수(formal parameter), 즉 포인터 변수에 전달됩니다. 함수 내부에서는 이 주소를 사용하여 원본 변수에 직접 접근할 수 있으며, 따라서 함수 안에서 값을 변경하면 호출한 쪽의 원본 변수 값도 함께 변경됩니다.
주요 특징
- 함수 호출 시 변수의 주소값(&)을 인수로 전달합니다.
- 형식 매개변수는 반드시 포인터(*)로 선언해야 합니다.
- 함수 내부에서는 역참조 연산자(*)를 사용해 원본 값에 접근하고 수정할 수 있습니다.
- 값에 의한 호출(Call by Value)과 달리 원본 데이터가 변경될 수 있습니다.
예제 코드: 두 수 교환(Swap)
다음 예제는 참조에 의한 호출을 이용해 두 변수의 값을 서로 교환하는 프로그램입니다.
#include<stdio.h>
void main(){
void swap(int *,int *);
int a,b;
printf("enter 2 numbers");
scanf("%d%d",&a,&b);
printf("Before swapping a=%d b=%d",a,b);
swap(&a, &b); // 주소값을 인수로 전달
printf("after swapping a=%d, b=%d",a,b);
getch();
}
void swap(int *a,int *b){
int t;
t=*a;
*a=*b; // *a = (*a + *b) – (*b = * a);
*b=t;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
enter 2 numbers 10 20
Before swapping a=10 b=20
After swapping a=20 b=10
코드 설명
swap(&a, &b)처럼 변수 앞에 주소 연산자(&)를 붙여 각 변수의 메모리 주소를 함수에 전달합니다. swap 함수는 포인터 매개변수 int *a와 int *b를 통해 전달받은 주소에 저장된 실제 값에 접근하여 두 값을 교환합니다.
그 결과, 함수가 종료된 후에도 main 함수의 변수 a와 b의 값이 10과 20에서 20과 10으로 서로 바뀌어 있는 것을 확인할 수 있습니다. 이것이 바로 참조에 의한 호출의 핵심 동작 원리입니다.