반응형
Call by value와 Call by reference의 차이점

함수를 호출할 때 단순히 값을 전달하는 형태를 Call-by-value(값에 의한 호출)라 합니다.

메모리 접근에 사용되는 주소 값을 전달하는 형태는 Call-by-reference(참조에 의한 호출)라 합니다.

둘을 구분하는 기준은 함수의 인자로 전달되는 대상에 있습니다.

 

값을 전달하는 함수 호출 : Call-by-value

밑의 코드처럼 사용되는 것이 값에 의한 호출입니다.

Call-by-value 함수는 외부에 선언된 변수에 접근이 불가능합니다.

void CallByValue(int value);

 

밑의 코드는 Call-by-value의 전형적인 잘못된 예시입니다.

Swap 함수를 거치면 두개의 변수의 값이 바뀔것 같지만 실상은 그렇지 않습니다.

void Swap(int num1, int num2)
{
    int temp = num1;
    num1 = num2;
    num2 = temp;
    printf("num1 : %d num2 : %d \n", num1, num2);
}

int main()
{
    int num1 = 10;
    int num2 = 20;
    printf("Swap전 num1 : %d num2 : %d \n", num1, num2);

    Swap(num1, num2);	// 이 부분에서 Swap이 될 것으로 예상
    printf("Swap후 num1 : %d num2 : %d \n", num1, num2);
    return 0;
}

위의 코드를 실행하면 아래의 출력값이 나옵니다.

값에 의한 호출은 이렇게 함수에서 인자의 값을 main함수로 전달해주지 못합니다.

이것은 Swap함수안의 변수들은 main함수의 변수들과 아예 다른 변수입니다.

main함수의 변수들은 데이터가 계속 남아있지만, Swap함수의 변수들의 메모리는

Swap함수가 종료하면서 저절로 해제됩니다.

즉 main함수의 변수값에 영향을 주지 않습니다.

 

주소값을 전달하는 함수 호출 : Call-by-reference

C언어는 Call-by-reference를 지원하지 않는다!

C++에는 Call-by-reference를 지원한다

 

Call-by-refernce는 직접적으로 해당 메모리를 참조하여 그 값을 쓰지만

C에서는 함수에서 인자로 전달받은 메모리의 값을 매개변수 메모리에 복사하여 사용하는 것입니다.

즉 메모리 공간이 다릅니다. 이는 곳 값에 의한 호출을 의미합니다.

하지만 값은 바뀝니다! 편의상 구분을 위해 여기서는 참조에 의한 호출이라고 명하겠습니다

 

밑의 코드는 C언어의 참조에 의한 호출입니다.

참조에 의한 호출에 전형적인 예시인 Swap함수를 구현한 것입니다.

void Swap(int* ptr1, int* ptr2)
{
    int temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;\
    printf("num1 : % d num2 : % d \n", *ptr1, *ptr2);

}


int main()
{
    int num1 = 10;
    int num2 = 20;
    printf("Swap전 num1 : %d num2 : %d \n", num1, num2);

    Swap(&num1, &num2);
    printf("Swap후 num1 : %d num2 : %d \n", num1, num2);
    return 0;
}

위의 코드를 실행하면 아래의 출력값이 나옵니다.

값에 의한 호출과 달리 swap함수후에는 값이 변하게 됩니다.

main함수의 변수의 메모리를 참조하기에 swap함수에서 값을 바꿔도

그 값이 main함수의 변수에도 영향을 미칩니다.

 

 

 

scanf함수 호출 시 &연산자를 붙이는 이유

변수 num앞에 &연산자를 붙이는 이유는

scanf함수 내에서 외부에 선언된 변수 num에 접근하기 위해서는 num의

주소 값을 알아야 한다. 그래서 scanf함수는 변수의 주소 값을 요구합니다.

 

배열 이름 str 앞에 &연산자를 붙이지 않는 이유는

str은 배열의 이름이고 그 자체가 주소 값이기 때문에 &연산자를 붙이지 않습니다.

str을 전달하는것은 scanf함수 내부로 배열 str의 주소 값을 전달하는 것과 같습니다.

int num;
scanf("%d", &num);

char str[50];
scanf("%s", str);

 

 

반응형

 

반응형

'C' 카테고리의 다른 글

상수 형태의 문자열을 가리키는 포인터  (0) 2023.05.16
포인터 대상의 const 선언  (0) 2023.05.15
포인터와 함수 이해  (0) 2023.05.15
포인터 배열  (0) 2023.05.15
포인터 연산  (0) 2023.05.15

+ Recent posts