Call By Reference

EHminShoov2J·2023년 8월 25일
0

CPP/코딩테스트

목록 보기
10/25
post-thumbnail

1. Call By Value

함수 내부에서 전체 복사가 일어나고, 실제 변수와는 다른 주소에 값이 할당. 따라서 함수 내부에서 값을 바꾸어 준다 하더라도 실제 값에서는 변화가 존재하지 않는다.

또한 값의 복사가 발생하기 때문에, 단순하게 저장 주소를 넘겨주는 Call By Reference 보다 오래 걸리는 경우가 발생할 수 있다.

2. 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;
}

3. Array와 Vector의 값 변경

3.1. Array

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;} // 랜덤으로 할 수 있는건 가장 앞단만!

3.2. Vector

아래와 같이 함수에 적용 가능

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라는 배열로 해석하는 경우

0개의 댓글