IT 1학년을 위한 C 언어의 pass-by-value와 pass-by-reference 설명

TL;DR


  • 값별 전달: 함수가 호출된 후 함수의 매개변수 값이 변경되지 않습니다.
  • 참조에 의한 전달: 함수가 호출된 후(함수에서 업데이트될 때) 함수의 매개변수 값이 변경될 수 있습니다.

  • 가치 전달



    변수를 선언하면 해당 변수에 대한 메모리가 할당됩니다. 함수를 호출하면foo(variable_name) 메모리에 있는 해당 변수의 값을 함수에 전달한다는 의미입니다. 함수가 무엇을 하든 변수의 메모리에 영향을 주지 않습니다. 변수 값은 동일하게 유지됩니다.

    예제 코드:

    #include <stdio.h>
    
    void foo(int x);
    
    int main() {
        int a = 1;
    
        foo(a);
    
        printf("a: %d", a); //a: 1
    
        return 0;
    }
    
    void foo(int x) {
        x = 5;
    }
    


    위의 샘플 코드에서 foo(a)를 호출하면 다음과 같습니다.
  • 실제로 호출합니다 foo(1)
  • foo(int x) 함수에서 x에 대한 새 메모리를 할당한 다음 x5로 설정합니다.
  • main 함수에서 a는 여전히 1입니다.

  • 참조에 의한 전달



    언급했듯이 변수를 선언하면 해당 변수에 대한 메모리가 할당됩니다. 메모리에는 메모리 주소가 있습니다. 함수를 호출하면foo(variable_memory_address) 메모리 주소를 함수에 전달한다는 의미입니다. 함수의 메모리 값을 변경하면 실제로 변수의 메모리 값이 업데이트됩니다. 그래서 변수 값이 변경됩니다.

    예제 코드:

    #include <stdio.h>
    
    void foo(int* px);
    
    int main() {
        int a = 1;
    
        foo(&a);
    
        printf("a: %d", a); //a: 5
    
        return 0;
    }
    
    void foo(int* px) {
        *px = 5;
    }
    


    위의 샘플 코드에서 foo(&a)를 호출하면 다음과 같습니다.
  • 실제로 foo(0xAB)를 호출합니다. (변수a의 메모리 주소를 0xAB로 가정)
  • foo(int* px) 함수에서 포인터px를 생성하고 px는 0xAB를 가리킵니다.
  • *px = 5를 설정하면 메모리 _0xAB의 값을 5로 설정한다는 의미입니다.
  • 그러면 main 함수에서 변수a의 메모리에 있는 값이 5로 변경되었으므로 이제 a의 값은 5가 됩니다.
  • 좋은 웹페이지 즐겨찾기