언어/C언어

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

칙칙폭폭 땡땡 2024. 4. 14. 15:56
반응형

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

 

오늘 알아볼것은 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 와는 서로 다른 주소에 할당됩니다. 그리고 함수가 종료되면 지역변수기에 사라집니다.

 

 

 

 

 

이상으로 마치겠습니다.

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

 

 

반응형