ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 Call-by-value vs. Call-by-reference
    Programming/C 2016. 5. 2. 20:42

    Call-by-value vs. Call-by-reference

    함수의 호출 방식을 의미

    Call-by-value

    단순히 값을 전달하는 형태의 함수호출

    #include <stdio.h>
    
    void Swap(int n1, int n2)
    {
        int temp = n1;
        n1 = n2;
        n2 = temp;
        printf("n1 n2: %d %d \n", n1, n2);
    }
    
    int main(void)
    {
        int num1 = 10;
        int num2 = 20;
        printf("num1 num2: %d %d \n", num1, num2);
    
        Swap(num1, num2);
        printf("num1 num2: %d %d \n", num1, num2);
        return 0;
    }
    num1 num2: 10 20
    n1 n2: 20 10
    num1 num2: 10 20
    

    num1과 num2에 저장된 값은 swap의 n1과 n2로 복사되어 값이 변경된다. 그래서 num1과 num2에 저장된 값의 변경으로는 이어지지 않는다. num1, num2는 n1,n2와 완전히 별개의 것이기 때문

    Call-by-reference

    #include <stdio.h>
    
    void Swap(int * ptr1, int * ptr2)
    {
        int temp = *ptr1;
        *ptr1 = *ptr2;
        *ptr2 = temp;
    }
    
    int main(void)
    {
        int num1 = 10;
        int num2 = 20;
        printf("num1 num2: %d %d \n", num1, num2);
    
        Swap(&num1, &num2);
        printf("num1 num2: %d %d \n", num1, num2);
        return 0;
    }
    num1 num2: 10 20 
    num1 num2: 20 10
    

    scanf 함수호출 시 &연산자를 붙이는 이유

    int main(void)
    {
        int num;
        scanf("%d", &num);
        ...
    }

    위의 scanf 함수호출이 완료되면 변수 num에는 값이 채워진다. scanf 함수는 num의 주소값을 알아야 변수 num에 접근해 값을 채워넣을 수 있다.
    scanf 함수의 호출도 Call-by-reference형태의 함수호출에 해당한다.
    문자열을 입력받을 때에는 문자열 배열이 전달되어 그 자체로 주소 값을 전달하기 때문에 &연산자를 붙이지 않는다.

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

    C언어 다차원 배열  (0) 2016.05.02
    C언어 포인터 대상의 const 선언  (0) 2016.05.02
    C언어 포인터 배열  (0) 2016.05.02
    C언어 변수  (0) 2016.05.02
    c언어 포인터  (0) 2016.05.02

    댓글

Designed by Tistory.