본문 바로가기

C, C++

C++/call by value, call by reference

call by value (값에 의한 호출)
호출되는 함수의 가인수로 실인수의 값을 복사해서 넘겨준다.

실인수와 가인수는 독립된 메모리 공간을 사용한다. 
가인수에 저장된 데이터가 변경되도 실인수에 저장된 데이터는 변경되지 않는다.

부작용(side effect) 현상이 발생되지 않는다. 
함수를 호출할 때 여러개의 데이터를 넘겨줄 수 있지만 결과는 return 에 의해서 1개만 받을 수 있다. 
데이터를 던지면 일반 변수로 받는다. 


call by reference (참조(주소)에 의한 호출)
호출되는 함수의 가인수로 실인수가 메모리에 생성된 주소를 넘겨준다. => 실인수와 가인수는 같은 주소를 참조한다. 
같은 메모리 공간을 사용한다. => 메모리를 공유해서 사용한다.
실인수와 가인수가 같은 메모리 공간을 사용하므로 가인수에 저장된 데이터가 변경되는 순간 실인수에 저장된 데이터가 동시에 변경된다. 

부작용(side effect) 현상이 발생될 수 있기 때문에 주의해야 한다.
가인수에 저장된 데이터가 변경될 때 실인수에 저장된 데이터도 같이 변경되므로 여러 개의 결과를 받는 효과를 낸다. 
주소를 던지면 포인터 변수나 참조 변수로 받는다. 

 

예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 두 인수를 서로 교환하는 함수를 만들어서 두 인수를 출력하자.
 
void change(int* a, int* b) {    // 주소가 날아오면 포인터로 받기.
    int temp = *a;
    *= *b;
    *= temp;
}
 
// reference 변수를 이용한 call by reference
void change(int& a, int& b) {    
    int temp = a;
    a = b;
    b = temp;
}
 
void change(double& c, double& d) {
    swap(c, d);
}
 
void change(char& ch1, char& ch2) {
    char temp = ch1;
    ch1 = ch2;
    ch2 = temp;
}
 
void main() {
 
    int a = 3, b = 4;
    printf("a = %d, b = %d\n", a, b);    // a = 3, b = 4
    swap(a, b);
    printf("a = %d, b = %d\n", a, b);    // a = 4, b = 3
    change(&a, &b);
 
    printf("a = %d, b = %d\n", a, b);    // a = 3, b = 4
    change(a, b);
    printf("a = %d, b = %d\n", a, b);    // a = 4, b = 3
 
    printf("=====================================\n");
 
    double c = 9.1, d = 2.5;
    printf("c = %.1f, d = %.1f\n", c, d);    // c = 9.1, d = 2.5 
    change(c, d);
    printf("c = %.1f, d = %.1f\n", c, d);    // c = 2.5, d = 9.1
 
    printf("=====================================\n");
 
    char ch1 = 'A', ch2 = 'a';
    printf("ch1 = %c, ch2 = %c\n", ch1, ch2);     // ch1 = 'A', ch2 = 'a'
    change(ch1, ch2);
    printf("ch1 = %c, ch2 = %c\n", ch1, ch2);    // ch1 = 'a', ch2 = 'A'
 
    printf("=====================================\n");
 
    
}
cs

'C, C++' 카테고리의 다른 글

C++/구조체  (0) 2020.01.13
C++/template/함수 템플릿/템플릿에 관하여  (0) 2020.01.13
C++/달력 만들기 헤더 파일/  (0) 2020.01.10
C++/왕복버블정렬 알고리즘  (0) 2020.01.08
C++/소인수분해 알고리즘 문제/  (0) 2020.01.08