C 프로그래밍 언어에서 참조에 의한 전달(pass by reference)은 함수를 호출할 때 변수의 값을 복사해서 넘기는 대신, 변수가 저장된 메모리 주소를 인수(argument)로 전달하는 방식입니다. 함수 내부에서 포인터를 통해 해당 주소에 접근하면 원본 변수의 값을 직접 읽고 수정할 수 있습니다.
참고로 엄밀히 말하면 C 언어는 항상 '값에 의한 전달(call by value)' 방식을 사용하지만, 포인터로 주소값을 넘김으로써 참조에 의한 전달과 동일한 효과를 얻을 수 있습니다.
동작 원리(알고리즘)
다음은 C 언어에서 참조에 의한 전달이 어떻게 동작하는지 설명하는 알고리즘입니다.
START
Step 1: 호출될 함수를 포인터 변수와 함께 선언한다.
Step 2: 변수 a, b를 선언한다.
Step 3: 실행 시점에 두 변수 a, b의 값을 입력받는다.
Step 4: 참조에 의한 전달 방식으로 함수를 호출한다. → Step 6으로 이동
Step 5: 결과값 a, b를 출력한다.
Step 6: 주소를 인수로 받는 swap 함수가 호출된다.
i. 임시 변수 temp를 선언한다.
ii. temp = *a
iii. *a = *b
iv. *b = temp
STOP
예제 프로그램 1: 두 숫자 교환하기
다음은 참조에 의한 전달을 사용하여 두 숫자를 서로 교환(swap)하는 C 프로그램입니다.
#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);
}
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의 주소(&a, &b)를 전달받아, 역참조 연산자(*)로 해당 메모리 위치의 실제 값을 변경합니다. 그렇기 때문에 함수가 종료된 후에도 main 함수의 원본 변수 값이 서로 바뀌어 있는 것을 확인할 수 있습니다. 만약 값을 복사하는 일반적인 방식으로 호출했다면 함수 내부에서만 값이 바뀌고 원본에는 아무런 영향을 주지 못했을 것입니다.
예제 프로그램 2: 호출 시마다 값 5씩 증가시키기
참조에 의한 전달을 더 깊이 이해하기 위해, 함수가 호출될 때마다 변수의 값을 5씩 증가시키는 또 다른 예제를 살펴보겠습니다.
#include <stdio.h>
void inc(int *num){
// num의 값이 저장된 주소에서
// 증가 연산이 수행됩니다.
*num = *num+5;
}
int main(){
int a=20,b=30,c=40;
// 변수 a, b, c의 주소를 전달
inc(&a);
inc(&b);
inc(&c);
printf("Value of a is: %d\n", a);
printf("Value of b is: %d\n", b);
printf("Value of c is: %d\n", c);
return 0;
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Value of a is: 25 Value of b is: 35 Value of c is: 45
핵심 정리
- 주소 전달: 함수 호출 시 &(주소 연산자)로 변수의 주소를 넘깁니다.
- 포인터 매개변수: 함수는 int *처럼 포인터 타입으로 주소를 받습니다.
- 원본 변경 가능: 역참조 연산자(*)를 사용하면 함수 안에서 원본 변수의 값을 직접 수정할 수 있습니다.
- 활용 사례: 두 변수 교환, 함수에서 여러 결과값 반환, 큰 구조체를 복사 비용 없이 전달할 때 유용합니다.