hahahia

매개변수 전달 기법 본문

Language/C

매개변수 전달 기법

hahahia 2012. 2. 17. 12:21
(1) call-by-value
  call-by-value는 단순히 실 매개변수 값을 형식 매개변수에 복사함으로 구현한다. 따라서 실 매개변수의 값은 피 호출 함수가 실행된 후에도 변하지 않는다. 이와 같은 기법은 주로 함수(sub program)에 값을 전달하고 실 매개변수의 값을 원형대로 보존하기 위하여 사용한다.
따라서 실 매개변수의 값이 피 호출 함수의 형식 매개변수에 복사되기 때문에 값의 참조가 빠르다. 그리고 함수의 실행 후에도 실 매개변수의 값이 변경되지 않아 자료의 보호가 가능하다. 그러나 형식 매개변수에 대한 기억 공간을 별도로 마련해야 하기 때문에 기억의 장소의 소모가 크고, 배열과 같은 자료는 복사에 많은 시간이 소모된다.
C언어 에서는 배열을 call-by-value의 매개변수로 취할 수 없는데 C언어에서 배열명은 배열의 시작주소를 나타내는 포인터이기 때문이다.
 

#include <stdio.h> // call-by-value 이용한 제곱 계산

int sqrt(int); // 함수선언

void main()

{

        int result, var;

        var=10;

        result = sqrt(var); // 매개변수 var

        printf("%d, %d", result, var); // 10, 100

}

int sqrt(int x)

{

        x = x*x;

        return x ; // main 함수에 x 반환

}

 

 


(2) call-by-reference
  call-by-reference는 실 매개변수의 주소를 형식 매개변수에 복사하여 형식 매개변수는 전달반은 주소로 실 매개변수의 값을 간접적으로 조회하는 기법이다. 즉 형식 매개변수의 값이 실 매개변수의 값이 서로 연결되어 전달되는 효과를 가진다.
실 매개변수는 전달할 변수의 주소를 값으로 하고, 형식매개변수는 그 주소의 값을 받아들일 수 있는 포인터 변수로 하여 구현 할 수 있다.
call-by-reference는 주소에 의하여 값을 간접적으로 조회하기 때문에 조회 시간이 걸리지만, 방대한 자료와 복사가 이루어지지 않기 때문에 call-by-value에 비하여 기억 공간의 낭비를 줄일 수 있다.

#include <stdio.h>

void sqrt(int *x);  // 함수선언

void main()

{

        int var;

        var=10;

        sqrt(&var); // 매개변수 주소값을 넘긴다

        printf("%d", var);

}

void sqrt(int *x) // var 주소를 x 복사(x 포인터 변수죠 ㅎㅎ)

{

        *x = *x * *x;   // x var처럼 사용합니다. 그러면 var값이 자동으로 바뀌겠죠

}

 

 

위 예제에서는 간단한 정수현 변수 하나만을 매개변수로 하였기 때문에 call-by-value와 call-by-reference의 차이를 느끼기 힘들지만, 배열과 같은 크기가 큰 자료를 매개변수로 취할 경우에는 call-by-reference가 더 효율적이다. 


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

배열(Array)  (0) 2012.02.17
포인터(Pointer)  (0) 2012.02.17
숫자 baseball game  (0) 2012.02.16
난수 생성 srand 함수  (0) 2011.05.27
지역 변수와 전역 변수  (0) 2011.05.22
Comments