본문 바로가기
c++

[C++] 2가지 call by reference(주솟값, 참조자 이용)

by yoonjunho 2023. 1. 20.

call by reference : 참조에 의한 호출

: 메모리 주솟값을 넘기는 방식

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

call by reference variable : 참조자를 이용한 참조에 의한 호출

int a=1;
int b=2;

swap(a,b)

void swap(int &a, int &b){
    int temp=a;
    a=b;
    b=temp;
}

이렇게 하면 call by reference와 같이 a와 b의 값이 실제로 바뀐다.

 

C++에서 함수 외부에서 선언된 변수에 접근하는 두 가지 방식

- 주솟값을 이용한 Call-by-reference

- 참조자를 이용한 Call-by-reference

#include <iostream>

void swap(int& a, int &b);
int main(void){

	int a = 1;
	int b = 2;
	std::cout << a << " " << b << std::endl;
	swap(a, b);
	std::cout << a << " " << b;


	return 0;
}

void swap(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

참조자 : 

참조자(Reference) : 

변수는 할당된 메모리 공간에 붙여진 이름이다.

참조자는 할당도니 메모리 공간에 붙여진 다른 이름이다.즉 별명이다.

 

참조자는 

int b=2;

int &a=b; 이렇게 쓴다.

 

NULL로 초기화 할 수 없다. 

무조건 r-value가 있어야 한다. 

int& A = *pa; 이렇게 해도 된다. r-value에 이미 선언된 변수의 이름이나 *pa같은 게 오면 된다.

int& b; <-이건 안된다. 오류가 난다. 무조건 r-value가 있어야 한다.

 

#include <iostream>

void swap(int& a, int &b);
int main(void){

	int a = 1;

	int* pa = &a;
	int& A = *pa;
	std::cout << "A :: " << A;
	//int& b; //<-이건 컴파일 에러

	return 0;
}

 

참조자는 변수에 대해서 보다 함수에서 활용하는데 써먹는다.

->참조자로 call by reference를 할 수 있다.

 

#include <iostream>

void swap(int& a, int &b);
int main(void){

	int num01 = 1;
	int num02 = 2;
	std::cout << "num01 : " << num01 << " num01 : " << num01 << std::endl;
	swap(num01, num02);
	std::cout << "num01 : " << num01 << " num02 : " << num02 << std::endl;

	return 0;
}

void swap(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

이거는 

swap함수가 실행되면

int &a=num01;

int &b=num02;

이것과 같다. 그래서 원래 변수에 저 별명이 붙고 그걸 이용하는 것과 같다. 함수 외부의 변수와 연결고리가 된다.

 

call-by-value에서는 변수에 들어있던 값만 빼서 전달한다. 그런데 참조자에 의한 call by reference는 외부 함수도 다른 함수의 안에서 할당된 메모리 공간의 이름을 부를 수 있게 되기 때문에 메모리에 접근이 가능하다.