elevne's Study Note

C 공부 (6: Call by reference) 본문

Backend/C

C 공부 (6: Call by reference)

elevne 2023. 3. 7. 12:04

C 에서 함수호출 시 전달되는 인자의 값은 매개변수에 복사가 된다. 실제로 함수에 전달되는 값은 변수 그 자체가 아니라, 그 변수에 저장된 값인 것이다. 함수에 사용되는 변수는, 기존의 정의해둔 변수와 값만 같은 별개의 변수라고 생각하면 된다.

 

 

C 에서는 함수호출 시 인자로 배열을 통째로 전달해줄 수 없다. 매개변수로 배열을 선언할 수 없기 때문이다. 매개변수로 배열을 선언하는 것이 허용되지 않기 때문에, 배열의 주소 값을 전달하는 방식을 사용한다. 이 때, 포인터 변수를 사용할 수 있는 것이다. 아래와 같은 예제코드를 작성해볼 수 있다.

 

 

 

#include <stdio.h>

void showArrayElem(int* param, int len)
{
    int i;
    for (i=0; i<len; i++){
        printf("%d ", param[i]);
    }
    printf("\n");
}

void addArrayElem(int* param, int len, int add)
{
    int i;
    for (i = 0; i < len; i++){
        param[i] += add;
    }
}

int main() {
    int arr1[3] = {1, 2, 3};
    int arr2[5] = {4, 5, 6, 7, 8};

    showArrayElem(arr1, sizeof(arr1) / sizeof(int));
    addArrayElem(arr1, sizeof(arr1) / sizeof(int), 5);
    showArrayElem(arr1, sizeof(arr1) / sizeof(int));

    showArrayElem(arr2, sizeof(arr2) / sizeof(int));
    addArrayElem(arr2, sizeof(arr2) / sizeof(int), 5);
    showArrayElem(arr2, sizeof(arr2) / sizeof(int));

    return 0;
}

 

 

result

 

 

 

위와 같이 이는 변수를 복사해서 사용하는 것이 아니라 주소를 참조하고 있기 때문에 함수 내에서 배열 내의 값을 변경해줄 수도 있는 것이다. 이렇게 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출을 Call-by-reference 라고 부르며, 반대로 단순히 값을 전달하는 형태의 함수호출은 Call-by-value 라고 한다. Call-by-reference 함수를 배열이 아닌 것을 활용하여 작성해보자면 아래와 같이 해볼 수도 있다.

 

 

 

#include <stdio.h>

void Swap(int* ptr1, int* ptr2)
{
    int temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}

int main() {
    int num1 = 11;
    int num2 = 22;
    printf("num1: %d, num2: %d\n", num1, num2);
    Swap(&num1, &num2);
    printf("num1: %d, num2: %d", num1, num2);
    return 0;
}

 

 

result

 

 

 

 

 

Reference:

윤성우의 열혈 c 프로그래밍

'Backend > C' 카테고리의 다른 글

C 공부 (5: 포인터(2))  (0) 2023.02.03
C 공부 (4: 포인터(1))  (0) 2023.01.29
C 공부 (3: 배열)  (1) 2023.01.28
C 공부 (2: 반복문, static)  (0) 2023.01.27
C 공부 (1: ~ Casting)  (0) 2023.01.26