함수 내부에서 전체 복사가 일어나고, 실제 변수와는 다른 주소에 값이 할당. 따라서 함수 내부에서 값을 바꾸어 준다 하더라도 실제 값에서는 변화가 존재하지 않는다.
또한 값의 복사가 발생하기 때문에, 단순하게 저장 주소를 넘겨주는 Call By Reference 보다 오래 걸리는 경우가 발생할 수 있다.
변수 주소를 매개 변수로 함수에 전달하는 방법. (C 에서 Pointer를 통해서 진행하였지만, CPP 에서는 Reference Type이 존재하여 번거로운 작업 없이 진행 가능)
#include <iostream>
#include <vector>
using namespace std;
void call_v(int a){a = 10;}
void call_r(int& a){a = 10;}
void call_r(vector<int> &v){ v.push_back(10);}
int main(){
int a = 0;
cout << a <<endl;
call_v(a);
cout << a << endl;
call_r(a);
cout << a << endl;
vector<int> v;
v.push_back(1);
for(int a : v) cout << a << endl;
call_r(v);
for(int a : v) cout << a << endl;
}
Array의 경우 3가지 방법으로 함수에 적용가능
void change_a1(int a[]){a[2] = 10;} // 가변배열로
void change_a2(int a[3]){a[2] = 100;}// 크기를 정한 배열로
void change_a3(int *a){a[2] = 100;}// 포인터 변수로 받아서 진행 가능
이때 기본적으로 배열의 이름은 주소 이기에 위와 같이 사용할 수 있다.
int (&ref)[3] 과같은 방식으로 받을 수도 있으나, 어차피 주소가 주어지는 상황에서 크게 유의미 하지는 않다.
2차원 Array의 경우 가변 배열로 지정할 수 있는 것은 가장 바깥의 배열이다.
void change_a_2d(int a[][3]) {a[0][0] = 10000;} // 랜덤으로 할 수 있는건 가장 앞단만!
아래와 같이 함수에 적용 가능
void change_v1(vector<vector<int>> &v){v[0][0] = 9;}
void change_v2(vector<int> v[5]){ v[0][0] = 99;} // vector<int> 를 원소로 가지는 v라는 배열로 해석하는 경우