본문 바로가기

Windows Developer/C

[C] call by value와 call by reference


call by value : 값의 복사에 의한 함수 호출

#include<stdio.h>

void main()
{
int val1 = 10, val2 = 20;
int swap(int, int);

swap(val1, val2);

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

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;
}

< 출력 결과 >
 a : 20
 b : 10
 val1 : 10
 val2 : 20

swap함수가 끝났음에도 불구하고 val값은 변하지 않았다.
변수 a와 b에 복사해서 보냈기 때문에 val값은 변하지 않게 되는 것이다.



call by reference : 주소값을 인자로 전달하는 함수 호출

#include<stdio.h>

void main()
{
int val[2] = {10, 20};
int swap(int *);

swap(val);

printf("val : %d\n", val[0]);
printf("val : %d\n", val[1]);
}

int swap(int *a)
{
int temp = a[0];

a[0] = a[1];
a[1] = temp;

printf("a[0] : %d\n", a[0]);
printf("a[1] : %d\n", a[1]);

return 0;
}

< 출력결과 >
a[0] : 20
a[1] : 10
val : 20
val : 10

val배열의 값 자체가 바뀌어 있는 것을 알 수 있다.
swap함수내에서 a라는 포인터는 배열이 아니고 val이라는 배열을 가리키고 있을 뿐이다.



그래서 scanf("%d, &val);
이때의 &를 쓰지 않게 되면 call by value가 되어 버려 val값이 복사되어 인자로 넘어가게 된다
따라서 주소값을 넘겨줘서 call by reference형식으로 값을 넘겨 우리가 선언한 진짜 val에 값을 입력할 수 있도록 하는 것이다.

그러면  scanf("%s", val);
여기서 문자열은 하나의 배열로 입력받거나 포인터로 받거나 하기 때문에 구지 &를 붙이지 않아도 그 배열이름 자체가 주소값이기 때문에 상관없다.

'Windows Developer > C' 카테고리의 다른 글

[C] main(int argc, char *argv[])에서 포인터를 쓰는 이유?  (0) 2010.08.01
[C] 재귀함수  (0) 2010.07.20
[C] 동적 메모리  (0) 2010.07.20
[C]포인터의 장점  (0) 2010.07.17