Call-by-value
값을 전달하여 함수를 호출하는 형태
Call-by-reference
메모리의 접근에 사용되는 주소 값을 전달하여 함수를 호출하는 형태
둘의 차이점은 함수의 인자로 전달되는 대상에 있다.
Call-by-value 형태의 함수에서는 함수 외부에 선언된 변수에 접근이 불가능하다.
Call-by-reference 형태의 함수에서는 외부에 선언된 변수에 접근이 가능하다.
// call-by-value
void NoReturnType(int num) // num으로 값이 복사되는 형태
{
if (num < 0)
return;
...
}
// call-by-reference
void ShowArayElem(int * param, int len) // 메모리 변수의 주소 값을 복사해서 전달
{
int i;
for (i = 0; i < len; i++)
printf("%d", param[i]);
printf("\n");
}
잘못된 Call-by-value 예시
Swap 함수 내에서의 값 교환은 외부에 영향을 미치지 않기 때문에
main에서의 출력값이 바뀌지 않았다.
main에서 출력하고자 할때는 Call-by-reference를 사용하면 된다.
Swap 함수 내에서 함수 외부에 있는 변수의 값을 교환한다.
scanf함수 사용시 &연산자를 붙이는 이유
// 변수num앞에 &붙이기
void main(void)
{
int num;
scanf("%d", &num);
...
}
scanf 함수 내에서 외부에 선언된 변수 num에 접근 하기 위해서는
num의 주소 값을 알아내야함.
그래서 scanf 함수는 변수의 주소 값을 요구한다.
배열에서는
// 배열에서는 &을 붙이지 않는다
void main(void)
{
char str[10];
scanf("%s", str);
...
}
str이 배열의 이름이고 그 배열의 이름 자체가 주소 값이다.
그래서 &연산자를 붙이지 않는다.
'공부 > C언어' 카테고리의 다른 글
(C 예제) 다차원 배열과 예제 (0) | 2020.06.28 |
---|---|
(C 예제) 함수의 인자로 배열 전달 (0) | 2020.06.27 |
(C예제) 상수형태의 포인터 (0) | 2020.06.27 |
(C 예제) 포인터와 배열 (0) | 2020.06.27 |
(C 예제) 포인터 정리 및 예제 (0) | 2020.06.26 |