Call by.. what?

2021. 1. 14. 23:04Programming Language/C · C++

Call by..

함수의 호출 방식은 크게 두가지가 있는데, 바로 Call by valueCall by reference이다.

Call by value

인자로 받은 값을 복사한다. 단지 복사만 하는 것이기 때문에 원형은 바뀌지 않는다.

C

// C

#include <stdio.h>

void swap(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
}

int main() {
    int x = 10;
    int y = 20;

    printf("x = %d, y = %d\n", x, y);
    swap(x, y);
    printf("x = %d, y = %d\n", x, y);
    return 0;
}

C++

// C++

#include <iostream>
using namespace std;

void swap(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
}

int main() {
    int x = 10;
    int y = 20;

    cout << "x = " << x << ", y = " << y << endl;
    swap(x,y);
    cout << "x = " << x << ", y = " << y << endl;
    return 0;
}

Call by reference

인자로 받은 값을 주소를 참조한다. 참조로 받게 되면 원형이 바뀌게 된다.

// C++

#include <iostream>
using namespace std;

int main() {
    int b = 10;
    int &a = b;

    a += 10;

    cout << b << endl;
}

이때 ab이름표에 불과하다.
따라서 참조변수 a는 실체가 없다. 참조변수 a는 정의와 동시에 초기화 해 주어야 한다.

int& a;
int b = 10;
a = b;

이렇게 사용하면 다음과 같은 오류가 발생한다.


Call by reference의 swap은 어떨까?

C++

// C++

#include <iostream>
using namespace std;

void swap(int &x, int &y) {
    int tmp = x;
    x = y;
    y = tmp;
}

int main() {
    int x = 10;
    int y = 20;

    cout << "x = " << x << ", y = " << y << endl;
    swap(x,y);
    cout << "x = " << x << ", y = " << y << endl;
    return 0;
}

 
Call by pointer

C는 Call by value밖에없다. 다른 언어처럼 참조로 전달은 불가하다. 주소를 직접 넘겨주는것은 굳이 부르자면 Call by pointer 라고 할 수 있다.

// C

#include <stdio.h>

void swap(int* x, int* y) {
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

int main() {
    int x = 10;
    int y = 20;

    printf("x = %d, y = %d\n", x, y);
    swap(&x, &y);
    printf("x = %d, y = %d\n", x, y);
    return 0;
}
반응형

'Programming Language > C · C++' 카테고리의 다른 글

[C/C++] EOF  (0) 2020.09.04