2. 2
Call-by-Value
§ Call-by-Value
– 함수 호출시 argument의 값(value)이 parameter 로 넘어가는
형식으로 함수가 호출되는 것
– 값만 copy되므로, function안에서 변경된 parameter의 값은
유지되지 않는다.
void function(int) ;
int main(void) {
int a=1;
function(a);
printf(“after function call : %dn”, a);
return 0;
}
void function(int a) {
a = a + 1 ;
return ;
}
3. 3
Call-by-Value
1 1
main 의 a
function 의 a
main() function function() function
a = a + 1 ;
function(a); 가 호출될 때
main의 a가 가진 값이
function의 a로 복사된다.
2
Return 후
1 main의 a와 function의 a는 서로 다른 변
수이기 때문에, function의 a를 수정하여
도 main의 a의 값은 변화하지 않는다.
1
4. 4
Call-by-Reference
§ Call-by-Reference
– argument의 값이 아닌, argument의 주소를 함수에 넘기는
방식으로 함수를 호출하는 방식
– 주소를 통하여 원래 변수의 값을 함수 내에서 변경 가능
§ Call-by-Reference 구현 (using pointer)
– 주소를 값으로 하는 pointer를 이용한다.
– Function Parameter를 pointer로 선언한다.
– Function Body에서 indirect operator(*)를 사용한다.
– Function Call 할 때 address를 argument로 한다.
6. 6
Call-by-Reference
1 1000
main 의 a
function 의 pa
main() function function() function
*pa = *pa + 1 ;
function() 가 호출될 때
main의 a의 주소값이
function의 pa로 복사된다.
1000
Return 후
2
function의 pa에 main a의 주소가 있기 때
문에, *pa는 main의 a를 의미하고, 따라서
*pa = *pa + 1 ; 하면 main의 a 값이 변화하
게 된다.
1000
2
7. § Swap Function
7
Call-by-Reference
[Ex]
void swap(int i, int j) {
int temp = i ;
i = j;
j = temp;
}
int main(void) {
int a=3, b=7;
printf(“before swap : %d %dn”, a, b);
swap( a, b );
printf(“after swap : %d %dn”, a, b);
return 0;
}
a, b 두 변수의 값이 바뀔까?
8. § Swap Function
8
Call-by-Reference
[Ex]
void swap(int *p, int *q) {
int temp = *p ;
*p = *q;
*q = temp;
}
int main(void) {
int a=3, b=7;
printf(“before swap : %d %dn”, a, b);
swap(&a, &b);
printf(“after swap : %d %dn”, a, b);
return 0;
}
before swap : 3 7
after swap : 7 3
9. Call-by-Reference
§ 두 포인터 변수의 값을 swap하고 싶다.
9
[Ex]
void swap( ??, ?? ) {
??
}
int main(void) {
int a=3, b=7;
int *p = &a, *q = &b ;
printf(“before swap : %d %dn”, *p, *q);
swap( ??, ??);
printf(“after swap : %d %dn”, *p, *q);
return 0;
}
before swap : 3 7
after swap : 7 3
10. § 두 포인터 변수의 값을 swap하고 싶다.
10
Call-by-Reference
[Ex]
void swap(int **pp, int **qq) {
int *temp = *pp ;
*pp = *qq;
*qq = temp;
}
int main(void) {
int a=3, b=7;
int *p = &a, *q = &b ;
printf(“before swap : %d %dn”, *p, *q);
swap(&p, &q);
printf(“after swap : %d %dn”, *p, *q);
return 0;
}
before swap : 3 7
after swap : 7 3