ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Call by value vs Call by reference
    C언어 2021. 6. 30. 16:10

    C언어에서 함수에 인자를 전달하는 방식은 2가지가 있다.

    • 값을 전달 -> Call by value
    • 주소를 전달 -> Call by reference

    1. Call by value

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
     
    void swap(int a, int b) {
        int tmp = a;
        a = b;
        b = tmp;
    }
     
    void main() {
        int a = 10, b = 20;
     
        printf("함수 호출 전 a = %d b = %d\n", a, b);
     
        swap(a, b);
     
        printf("함수 호출 후 a = %d b = %d\n", a, b);
    }
    cs

    - 값에 의한 호출을 보여주기 위한 예시로 a와 b를 서로 바꿔주는 swap함수에 값을 넣었을 경우에 결과는 이러하다.

    Call by value

    - 변수의 이름이 같아도 매개변수로 보내지는 것은 변수의 주소가 아닌 값만 전달되기 때문에 main 함수에서 a와 b의 값이 바뀌지 않는것을 알 수 있다.

     

    2. Call by reference

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
     
    void swap(int* a, int* b) {
        int tmp = *a;
        *= *b;
        *= tmp;
    }
     
    void main() {
        int a = 10, b = 20;
     
        printf("함수 호출 전 a = %d b = %d\n", a, b);
     
        swap(&a, &b);
     
        printf("함수 호출 후 a = %d b = %d\n", a, b);
    }
    cs

    - 참조에 의한 호출을 보여주기 위한 예시로 위와 같아 보이지만 함수를 호출할 때 인자로 & 연산자를 넣어서 변수의 주소를 넣어주고, 함수를 선언할 때는 인자로 주어진 변수의 주소안에 있는 값을 가져오는 것을 알 수 있다.

     

    Call by reference

    - 변수의 주소값이 인자로 전달되었기 때문에 swap함수에서 값을 변경하면 main 함수 안에 있는 a와 b의 값에 영향을 준다는 것을 확인할 수 있다.

     

    3. 배열

    - 배열의 경우 배열명 == &배열[0](배열 첫번째 인덱스의 주소) 이기 때문에 사용법이 조금 특이하다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
     
    void func(int* stu) {
        for (int i = 0; i < 10; i++) {
            stu[i] = i;
        }
    }
     
    void main() {
        int stu[10= { 0 };
     
        printf("함수 호출 전 : ");
        for (int i = 0; i < 10; i++) {
            printf("%d ", stu[i]);
        }
        printf("\n\n");
        func(stu);
     
        printf("함수 호출 후 : ");
        for (int i = 0; i < 10; i++) {
            printf("%d ", stu[i]);
        }
    }
    cs
    배열을 인자로 넘겼을때의 결과

    -  배열 주소를 인자로 넘겨서 배열 안의 값들을 변경할 수 있다.

     

     

Designed by Tistory.