본문 바로가기

C언어/C_지식_정리

[C 언어] Call by value, Call by reference 차이점 설명

C언어에서 함수를 사용할 때, 값을 넘겨주는 방식이 크게 2가지가 있는데

Call by value 와 Call by reference가 있다.


Call by value
Call by value는 기본적으로 C언어에서 지원하는 방식으로, 함수의 매개변수에 인자값을 복사한다.

그럼, 함수가 어떤 변수로부터 받은 인자값과 매개변수는 복사되어서 값만 같을뿐, 별개의 변수가 된다.

결과적으로, 함수 안에서 매개변수 값이 변경되어도 원래의 변수값은 변하지 않는다.

Call by value ex)

#include <stdio.h>

void plusone(int a); // 함수 선언, plusone 괄호 안에 a변수는 매개변수이다
int main()
{
	int a;
	printf("정수값 입력 : ");
	scanf("%d", &a);

	plusone(a); // 메인함수의 a변수값을 인자값으로 plusone함수 매개변수에 준다

	printf("a : %d", a);

	return 0;
}
void plusone(int a) // 함수에 대해 정의
{
	a+=10; // a변수에 10을 더한다
}

(실행결과)

원래의 변수값이 그대로 출력됨

Call by reference
Call by reference는 사실상 C언어에서 지원하지 않는 방식이지만, Call by value를 이용해서 인자값으로 
주소값을 매개변수에 복사한다.

이 방식은 C언어에서 Call by address라고 불리지만, Call by reference와 동일한 결과를 가져오기 때문에 그냥 Call by reference 라고 불리기도 한다.

Call by reference(address) ex)

#include <stdio.h>

void plusone(int *a); // 함수 선언, 포인터 변수 a 가 매개변수로 선언
int main()
{
	int a;
	printf("정수값 입력 : ");
	scanf("%d", &a);

	plusone(&a); // 인자값으로 a변수의 주소값을 매개변수에 복사한다

	printf("a : %d", a);

	return 0;
}
void plusone(int *a) // 함수 정의
{
	*a += 10; // 메인함수의 a변수의 주소를 역참조하여서 값을 계산, 메인함수에서의 a 변수가 바뀐다.
}

(실행결과)

함수에서의 연산이 이루어짐