본문 바로가기

공부/C언어

(C) Call-by-value와 Call-by-reference/scanf에서 &붙이는 이유

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이 배열의 이름이고 그 배열의 이름 자체가 주소 값이다.

그래서 &연산자를 붙이지 않는다.