728x90
Call By Value
함수가 호출될 때, 인자로 변수를 전달하게 됩니다.
이때 변수 자체가 전달되는 것이 아닌 값만 복사가 됩니다.
Call By Value의 특성
Call By Value를 사용하게 되면, 서로 다른 두 함수간의 독립성이 보장됩니다.
즉, 디버깅이나 유지보수, 재사용에 유리합니다.
그렇지만 Call By Value로는 인자로 전달된 값 자체를 바꿀 수 없다는 단점이 있습니다.
따라서 이를 해결하기 위해 주소를 전달하는 방식을 사용할 수 있습니다.
#include <stdio.h>
void noSwap(int a, int b);
void swap(int * a, int * b);
int main(){
int a =10;
int b =20;
printf("before noSwap : (%d, %d)\n", a, b);
noSwap(a ,b);
printf("after noSwap : (%d, %d)\n", a, b);
printf("before swap : (%d, %d)\n", a, b);
swap(&a ,&b);
printf("after swap : (%d, %d)\n", a, b);
return 0;
}
void noSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
printf("noSwap : (%d, %d)\n", a, b);
}
void swap(int * a, int * b){
int temp = *a;
*a = *b;
*b = temp;
printf("swap : (%d, %d)\n", *a, *b);
}
결과는 다음과 같습니다.
Scanf 함수 호출 시 &연산자를 붙이는 이유
방금 위에서 살펴보았듯이, 함수의 인자로 전달되는 변수의 값을 변경하기 위해서는 그 변수의 주소가 인자로 전달되어야 합니다.
즉 사용자로부터 값을 입력받아 변수에 저장하는 scanf함수 등은, 저장할 변수의 주소가 인자로 전달되어야 하며 따라서 & 연산자를 붙여야 합니다.
그러나 문자열을 입력받는 경우, 배열의 이름은 그 자체로 포인터(주소)이므로, &연산자를 붙이지 않아도 되는 것입니다.
728x90
'c언어' 카테고리의 다른 글
[C언어] - 다차원 배열 (0) | 2022.05.06 |
---|---|
[C언어] - Const (0) | 2022.04.20 |
[C언어] - 포인터 (0) | 2022.04.19 |
[C언어] - 문자열 (0) | 2022.04.19 |
[C언어] - 배열 (0) | 2022.04.19 |