본문 바로가기
언어/C언어

[C 언어] call by value, call by reference 알아보기

by 천무지 2024. 4. 14.
반응형

안녕하세요. 복학하고 바빠서 오랜만에 글을 쓰네요.

 

오늘 알아볼것은 call by value, call by address 입니다.

 

이것들은 함수의 매개변수에 어떤값을 넣는가에 대한 개념입니다.

 

순서대로 대략적인 의미를 전달해보자면

 

call by value : 값에 의한 전달

call by reference : 주소에 의한 전달

 

입니다.

 

말로만 해선 무슨 말인지 모를 수 있을테니 순서대로 설명하면서 코드를 함께 볼게요.

 

 

1.call by value

#include <stdio.h>

void swap(int num1,int num2)
{
	int tmp;

	tmp = num1;
	num1 = num2;
	num2 = tmp;
}

void main()
{
	int a = 1;
	int b = 2;

	swap(a,b);

	printf("a = %d, b = %d", a, b);
}

함수를 통해 a와 b의 값을 바꾸고 싶은 상황입니다. 하지만 실행결과 전혀 바뀐게 없습니다. 왜 이럴까요?

우선 함수는 호출되면 num1에 a값이, num2에 b값이 그대로 들어가는게 아니라 복사된 값이 들어갑니다.

그리고 전달받은 매개변수를 가지고 두 값을 바꿉니다.

 

그 다음은?

無(무), 없어요 그냥

지금까지 함수가 했던 행동들은 다 쓰잘머리없는 짓들이였습니다. 함수 타입도 void라 반환도 없고 함수 안의 변수들은 지역변수라 함수가 끝나는 동시에 사라져버립니다. 

 

 

2.call by reference

#include <stdio.h>

void swap(int *num1, int *num2)
{
	int tmp;

	tmp = *num1;
	*num1 = *num2;
	*num2 = tmp;
}

void main()
{
	int a = 1;
	int b = 2;
    
	swap(&a, &b);
    
	printf("a = %d, b = %d", a, b);
}

드디어 두 값을 바꾸는데 성공했습니다. 어떻게 성공했는지 보겠습니다.

이번에는 a와 b의 주소를 넘겨줬습니다.

그래서 이번에는 int *num1 은 a의 주소를 값으로 가지고, int *num2는 b의 주소를 값으로 가집니다.

즉 [num1 == a의 주소, num2 == b의 주소] 가 되겠습니다.

여기에 역참조 연산자 '*' 를 num1과 num2에 취해주면 각각 a와 b의 값에 접근하게 됩니다.

그래서 값을 수정할 수 있게되요.

참, 그리고 num1과 num2는 각각 a,b 와는 서로 다른 주소에 할당됩니다. 그리고 함수가 종료되면 지역변수기에 사라집니다.

 

 

 

 

 

이상으로 마치겠습니다.

혹시라도 질문이 있으면 알려주세용

 

 

반응형