(1) Call - by - Value
: 가장 일반적인 함수 호출의 형태로 기본 호출 방식은 값의 복사이다. 따라서 값에 의한 호출이라고 한다.

- 함수를 호출하면서 해당 인자값을 파라미터로 넘겨주게 된다. 이때 그 인자값에 복사가 일어나 넘어가게 되고,
  호출받은 함수는 해당 인자값을 처리하는데, 그 과정에서 값에 변화가 일어나도 복사된값이기 때문에
  호출한 쪽의 변수값은 변하지 않는다.

● Example Source

#include<stdio.h>
#include<conio.h>

int swap(int a, int b)
{
     int temp = a;
     a = b;
     b = temp;

     printf("a : %d\n", a);
     printf("b : %d\n", b);

     return 0;
}

int main()
{
     int val1=10;
     int val2=20;

     swap(val1, val2);

     printf("val1 : %d \n", val1);
     printf("val2 : %d \n", val2);

     getch();
     return 0;
}

- 이 swap이라는 함수는, 함수 내부에서, 두 변수가 지니고 있는 값을 서로 바꿔줍니다.
- 소스를 main함수부터 분석해 보면, val1과 val2라는 변수를 만들과, 10과 20으로 값을 초기화 했습니다.
- 그리고, swap함수로 들어가, Call - by -value를 이용해, 값이 a와 b라는 매개 변수로 복사가 됩니다.
- 그리고, temp라는 변수를 보조로 만들어 주어, temp에게, a의 값을 가지게 한뒤, a의 값은 b의 값으로, b의 값은, temp의
   값으로 바꿉니다.
- 그렇게 되면, 결과적으로, a와 b의 값은 서로 바뀌게 된 셈이죠.
- a는 val1의 값을 복사 받았고, b는 val2의 값을 복사 받았으므로, 10과 20이 뒤바뀌어 a는 10이 되고, b는 20이 됩니다.
- 하지만, main함수의 val1과 val2변수는 어떨까요?? 값의 변화가 있을까요??? 아니죠!
- 이것이 바로, call - by - value가 가진 특성이라 말할 수 있습니다.

값이 복사된 변수와, 본래의 값을 가진 변수는, 남남이다.


(2) Call - by - Reference
: 포인터를 이용해, 배열을 인자로 전달하는것으로 참조에 의한 호출 이라고 한다.

- 함수를 호출하면서 해당 인자값을 파라미터로 넘겨주게 된다. 이때 그 인자값의 주소를 넘겨주고,
  호출받은 함수는 해당 인자값을 포인터 변수로 받아 처리하는데, 그 과정에서 값에 변화가 일어나면 
  호출한 쪽의 변수값도 같이 변하게 된다.

● Example Source

#include<stdio.h>
#include<conio.h>

int swap(int *a, int *b)
{
     int temp = *a;
     *a = *b;
     *b = temp;

     printf("a : %d\n", a);
     printf("b : %d\n", b);

     return 0;
}

int main()
{
     int val1=10;
     int val2=20;

     printf("Before val1 : %d \n", val1);
     printf("Before val2 : %d \n", val2);

     swap(&val1, &val2);

     printf("After val1 : %d \n", val1);
     printf("After val2 : %d \n", val2);

     getch();
     return 0;
}

- 결과




※ 참조 : http://blog.naver.com/wns1112?Redirect=Log&logNo=46180955

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

포인터의 const  (0) 2011.10.24
ASCII(아스키) 코드표  (0) 2011.10.21
argc & argv - Agument Count & Value  (0) 2011.09.29
#ifdef 와 #ifndef 전처리기  (0) 2011.09.29
자료형 크기 정리  (0) 2011.07.07
by 민트앤라떼 2011. 10. 4. 14:06