본문 바로가기
프로그래밍 언어/C 언어

[C] Call-by-value & Call-by-reference

by 까망 하르방 2021. 3. 20.
반응형

함수의 인자 전달

인자 전달의 기본 방식은 값의 복사(Call-by-value) 입니다.

값의 복사는 원본의 값이 함수 전/후로 변경되지 않습니다.

 

배열 원소도 마찬가지인데, 배열 원소 전부를 전달하는 방법은 없습니다.

대신, 주소값 전달(Call-by-reference)합니다.

그리고 주소값을 전달하는 경우에는 원본의 값이 전/후로 변경이 됩니다.

 

#include <stdio.h>

// 함수내에서 param의 크기는 배열의 크기가 아닌 포인터의 크기를 의미
// 따라서 배열의 크기를 별도 함수의 인자로 같이 전달받습니다.
void testFunc(int * param, int len) {
    for (int i = 0; i < len; i++) {
        param[i] *= 10;
    }
}

int main(void) {
    int arr[] = { 1, 2, 3 };
    int len = sizeof(arr) / sizeof(int);
    
    testFunc(arr, len);
    
    for (int i = 0; i < len; i++) {
        printf("%d \n", arr[i]);
    }
}

모든 요소들이 10배로 변경된 것을 확인할 수 있습니다.

 

배열 인자를 보내줄 때는 int * param int param[]은 동일한 의미를 가지고 있습니다.

void testFunc(int param[], int len) {...}

void testFunc(int * param, int len) {...}

배열이기 때문에 param[]이 좀 더 직관적입니다. 

하지만 동일시 되는 경우는 함수 인자전달 선언시로 제한됩니다.

main 함수 내에서 아래의 경우는 성립되지 않습니다.

int main(void){
    int arr[3] = {1, 2, 3};
  
  // int ptr[] = arr 대체 불가능
  // 배열은 배열 선언 및 초기화할 때 사용
    int * ptr = arr; 
}

 

swap 함수, 참조에 의한 전달

#include <stdio.h>

void swap(int * x, int * y) {
        // 주소에 저장된 실제값들을 교환
        int temp = *x;
        *x = *y;
        *y = temp;
}

int main(void) {
        int a = 10, b = 20;
        printf("%d %d \n", a, b);
        // 참조하는 주소값을 전달
        swap(&a, &b);
        printf("%d %d \n", a, b);
}

 

add 함수, 값에 의한 전달

#include <stdio.h>

void add(int a, int b){
    a = a + b;
}

int main(void){
    int a = 7;
    add(a, 10);
    printf("%d\n", a);
}

 

add 함수, 참조에 의한 전달

#include <stdio.h>

void add(int *a){
    *a = (*a) + 10;
}

int main(void){
    int a = 7;
    add(&a);
    printf("%d\n", a);
}

반응형

'프로그래밍 언어 > C 언어' 카테고리의 다른 글

[C] 포인터 변수 개념  (0) 2021.03.20
[C] 다차원 배열과 포인터 관계  (0) 2021.03.20
[C] 포인터와 배열의 관계  (0) 2021.03.20
[C] 동적 할당 필요성  (0) 2021.03.20
[C] [전처리기] #ifdef  (0) 2021.03.20

댓글