프로그래밍 언어/C++

함수와 포인터, 인수 전달 방식

claire 2022. 1. 8. 13:31

함수가 외부로부터 매개 변수를 통하여 데이터를 받는 방법은 크게 두가지 이다. 

 

Call by value : 값에 의한 호출             //인수의 복사본을 함수로 전달 - 원본 변화 없음

Call by reference : 참조에 의한 호출     //인수의 원본을 '직접' 함수로 전달

 

#include <stdio.h>

void swapNum(int first, int second)    // 반환값 없음, int형 매개변수 두 개 지정
{
    int temp;    // 임시 보관 변수

    temp = first;
    first = second;
    second = temp;
}

int main()
{
    int num1 = 10;
    int num2 = 20;

    swapNum(num1, num2);    // 변수 num1과 num2를 넣어줌

    printf("%d %d\n", num1, num2);    // 10 20: swapNum 함수와는 상관없이 
                                      // 처음 저장한 10과 20이 출력됨

    return 0;
}

위 코드의 출력 결과는 10 20 . swapNum 함수로 인해 main함수 내의 변수의 값이 바뀌지않았다. 즉, 매개변수는 값을 전달하는 역할만 할 뿐 함수 바깥의 변수와는 상관이 없다. 

 

다음은 매개변수를 포인터로 사용해보겠다. 

#include <stdio.h>

void swapNum(int *first, int *second)    // 반환값 없음, int 포인터 매개변수 두 개 지정
{
    int temp;    // 임시 보관 변수

    // 역참조로 값을 가져오고, 값을 저장함
    temp = *first;
    *first = *second;
    *second = temp;
}

int main()
{
    int num1 = 10;
    int num2 = 20;

    swapNum(&num1, &num2);        // &를 사용하여 num1과 num2의 메모리 주소를 넣어줌

    printf("%d %d\n", num1, num2);   // 20 10: swapNum에 의해서 num1과 num2의 값이 서로 바뀜

    return 0;
}

위 코드의 출력은 20 10 이다. 변수의 메모리 주소를 함수에 전달하면 함수 안에서는 메모리 주소에 접근하여 값을 저장할 수 있다. 

 

포인터 매개변수

함수의 반환값은 값을 하나만 반환할 수 있는데 이처럼 매개변수를 포인터로 사용하면 함수 바깥으로 여러 개의 값을 전달할 수 있다. 

지금까지 scanf 함수를 사용할 때 변수를 그대로 넣지 않고 &를 사용하여 변수의 메모리 주소를 넣었다. 왜냐하면 scanf 함수는 값을 여러개 입력받을 수 있는데 반환값만으로는 여러 개의 값을 함수 바깥으로 가져올 수 없었기 때문이다. 

int num1;
int num2;
int num3;

scanf("%d %d %d", &num1, &num2, &num3); // scanf에서 값을 3개 가져옴(scanf는 바깥으로 값을 3개 전달)

변수의 메모리 주소만 넘겨주면 값이 몇 개든 상관없이 값을 가져올 수 있다.