본문 바로가기

C++ 기초 1

[C++] 1-6 함수 호출 방식 (call by reference)

Call by reference

   call by reference 방식에서는 실인수의 주소가 함수에 전달된다. 함수는 실인수의 주소를 가인수로 복사하여 사용하므로 마치 실인수를 직접 사용하는 것과 같이 된다. 즉, 함수에서 가인수의 값을 바꾸면 호출 측의 실인수 값도 변한다. 이때 가인수는 주소를 전달받기 때문에 포인터로 선언돼야 한다. 

   함수에서 return문에 의해 반환되는 값의 개수는 오직 하나이다. 따라서 두 개 이상의 값을 반환하고 싶다면 call by reference 방식을 사용하는 것이 좋다. 또한 배열을 함수로 전달하는 경우에도 call by reference 방식을 사용하는 것이 편리하다. 

 

예제 1
#include <iostream>
using namespace std;
void func(int x, int y, int *z);		//함수의 원형 선언

int main()
{
	int a, b, c;
	a = 2, b = 3;
	func(a, b, &c);					//실인수 c의 주소 사용
	cout << "c = " << c << endl;
	return 0;
}

void func(int x, int y, int *z)			//사용자 정의 함수
{
	*z = x + y;
}
결과
c = 5
※ call by reference 방식에 의해 실인수 c의 주소(&c)를 포인터 z로 전달한다. 피 호출 함수에서는 가인수 z가 가리키는 메모리 영역(&c)에 x+y를 저장한다. 따라서 c는 5가 되었다. 
예제 2
#include <iostream>
using namespace std;
void swap(int* x, int* y);			//함수의 원형 선언

int main()
{
	int x, y;
	x = 100, y = 600;
	cout << "original values: x=" << x << ",y=" << y << endl;		//실인수로 주소 사용
	swap(&x, &y);
	cout << "new values: x=" << x << ", y=" << y << endl;		//가인수를 포인터로 선언
	return 0;
}

void swap(int* x, int* y)
{
	int temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
결과
original values: x=100,y=600
new values: x=600, y=100
※ call by reference 방식에 의해 실인수 x, y의 주소(&x, &y)를 가인수 *x와 *y에 전달한다. 실인수와 가인수는 이름이 동일하지만 서로 다른 메모리 영역을 사용하므로 별개이다. 

 

예제 3
#include <iostream>
using namespace std;
void cast(int* z);			//함수의 원형 선언

int main()
{
	int a[3];
	a[0] = 2, a[1] = 3;
	cast(a);			//실인수로 배열명(배열의 시작 주소) 사용
	cout << "a[2]=" << a[2] << endl;
	return 0;
}

void cast(int* z)		//가인수로 포인터 사용
{
	*(z + 2) = (*z) * (*(z + 1));
}
결과
a[2]=6
※ 배열명은 배열의 시작 주소를 나타내므로 호출 함수 cast(a);에서 배열 a의 시작 주소(&a[0]가 포인터인 가인수 z로 전달했다. 여기서 (*z)*(z(z+1)) = a[0]*a[1]=6이다. 

 

예제 4
#include <iostream>
using namespace std;
void print_upper(char* a);		//함수의 원형 선언

int main()
{
	char s[10];
	cin >> s;
	print_upper(s);
	return 0;
}

void print_upper(char* a)		//사용자 정의 함수
{
	int i = 0;
	cout << a << endl;
	while (*(a + i))			//*(a+i)가 0(거짓)이 아니면 루프를 반복 실행
	{
		*(a + i) = toupper(*(a + i));
		cout << *(a + i);
		++i;
	}
	cout << endl;
}

 

결과
computer <enter>
computer
COMPUTER
※ 배열을 함수로 전달하기 위해서는 call by reference 방식을 사용해야 한다. 배열명은 배열의 시작 주소를 나타낸다. 

 

참고

1. 장인성 외 5인, (초보자도 쉽게 따라 할 수 있는) C++프로그래밍, 광문각, 2017.02.13