본문 바로가기

c언어

[c언어] call by value, call by reference 차이점

0. 함수 호출 방법

- c에서 함수가 호출되는 방법은 대표적으로 call by value, call by reference가 있다.

- 실제 인자(actual parameter)
  함수에 전달되는 인자(=parameter, 매개변수)

 

- 형식 인자 (formal parameter) 

  함수가 전달받은 인자(=argument)

 

- 함수가 호출될 때, 메모리에 함수를 위한 임시 공간이 생성된다.

   이 공간은 함수가 종료되면 사라진다.

  메모리 구조 링크 

 

#include <stdio.h>

void func(int formal_parameter){ //형식 인자
    //func 호출되면 acual_parameter 값이 formal_parameter에 복사된다.
}

int main(int argc, const char * argv[]) {
    int actual_parameter; //실제 인자
    
    func(actual_parameter);
}

1. call by value (값에 의한 호출)

- 함수 호출 시 실제 인자 값이 형식 인자에 복사하는 방식이다.

- 복사된 값은 함수 안에서 지역적으로 쓰이는 local value 특성을 가진다.

   따라서 함수 안에서 값을 변경해도 실제 인자의 값은 변경되지 않는다.

2. call by reference (참조에 의한 호출)

- 함수 호출 시 실제 인자의 주소(레퍼런스)를 복사하는 방식이다.

- 주소를 복사하였기 때문에 해당 변수에 직접 접근할 수 있다.

   해당 값을 변경하면 실제 인자의 값도 변경된다.

3. 예제 - swap 함수

call by value 와 call by reference를 가장 쉽게 이해할 수 있는 건

입력된 두 수 a, b를 바꾸는 swap 함수이다.

#include <stdio.h>

void swap(int x, int y){
  int temp; //swap 하려면 temp 변수 필요하다.
  
  //swap
  temp = x;
  x = y;
  y = temp;
}

void main(){
   int a = 10, b = 20;
   
   swap(a, b);
   
   printf("a = %d b = %d\n", a, b);
}

함수에 넘겨준 파라미터가 실제 값이 아니라 복사된 값이기 때문에

함수 내에서는 값이 변경되었을지라도 실제 값은 변경되지 않았다.

실제 값도 변경하려면 아래와 같이 메모리 주소를 넘겨주면 된다.

#include <stdio.h>

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

void main(){
  int a = 10, b = 20;
  
  swap(&a, &b); //메모리 주소를 파라미터로 넘기기
  
  printf("a = %d b = %d", a, b);
}

 

'c언어' 카테고리의 다른 글

[c언어] 메모리 구조  (0) 2022.07.06