본문 바로가기

Programming/C Language

Call By Value & Call By Reference

이번에 정리할 내용은 CBV , CBR이다.        정말 중요한 내용이니 열심히 공부하자

Call By ValueCall By Reference는 둘 다 함수 호출 방식을 의미한다.

다만 함수의 인자(매개변수)로 전달되는 대상에 차이가 있다.


Call By Value : 함수 호출시 단순히 값(Value)만 전달하는 형태의 함수호출


Call By Reference : 함수 호출시 메모리 접근에 사용되는 주소 값을 전달하는 형태의 함수호출


여태 우리가 정의해왔던 대부분의 함수들은 값을 전달하는 형태로 Call By Value였다.

이번엔 Call By Reference형태의 함수호출을 이용한 예제를 살펴보자!




5행에서 선언한 함수를 주목하자 , 매개변수와 몸체부를 보자
전달 인자값으로 *ptr1과 *ptr2를 받고 , 몸체부에는 결과적으로 num1과 num2의 저장된 값을 서로 바뀌도록 구조화 했다.

이 Swap함수를 꼭 이해하고 넘어가자


그 다음 16행에선 기존의 num1과 num2를 출력한 후 17행에서 Swap함수를 호출시켜 num1과 num2의 주소를 변경시킨다.
여기서 중요한점은 각각 num1과 num2에 주소에 저장된 값이 변경되는것이 아니라 주소를 변경시키는 것이다.


한번 결과값을 살펴보자.




우리가 예상했던대로 Swap함수 호출을 통해 주소를 swap시켰다.

Swap함수의 흐름을 완벽히 이해하고 넘어가야 추후 공부에 지장이 없으니 꼭 꼭 이해하자.


Call By Reference에 대해 개념을 알았으니 이제는 scanf_s함수 사용시 '&'연산자를 이용하는 이유에 대해 설명하겠다.

다음의 간략한 코드를 보자


int main(void)
{
    int num;                                                

    scanf_s("%d",&num);                        //여기서 & 연산자는 주소값을 반환하는 역할을한다. 즉 변수 num의 주소값을 scanf_s함수에 전달

.    .    .    .                                      하는 것이다!

}


scanf_s함수 또한 입력받은 값을 그대로 저장하는것이 아니고 num의 주소값을 받고 그 주소에 접근하여 num값을 저장하는 것이다.
결과적으로 scanf_s함수 또한 Call By Reference 형태의 함수호출방법을 사용한다는 점이다.



이어서 앞서 우리가 배열을 처음 공부할때 배열을 입력받을때 & 연산을 쓰지 않은 이유에 대해 설명하겠다.

다음 코드를 보자
int main(void)
{
    char str[30];                    

   scanf_s("%d", str);

}


문자열 배열을 입력받을때 &연산을 쓰지 않은 이유는 배열 'str' 자체가 배열의 주소값을 의미하기 때문이다.

배열의 이름은 배열의 첫 주소값을 의미하기 때문에 & 연산자 필요없이 그냥 str만써도 주소값을 바로 전달이 가능하다.



'Programming > C Language' 카테고리의 다른 글

문자,문자열 관련 함수  (0) 2017.11.01
다차원 배열  (0) 2017.11.01
포인터 배열  (0) 2017.11.01
포인터 연산  (0) 2017.10.31
포인터와 배열의 관계  (0) 2017.10.31