카메라 개발자 공부방(SW)

[26장] 가변인자 본문

Langauge/C

[26장] 가변인자

luckmart 2021. 10. 17. 16:35
반응형

오늘은 가변 인자에 대해 배워볼 시간입니다.

가변 인자의 대표적인 함수로는 prinf와 scanf 함수가 있습니다.
함수를 호출하여 인자를 전달할 때, 인자 입력에 제한이 없었죠?

printf("%d\n", 1);
printf("%d %d\n", 1, 2);
printf("%d %d %d\n", 1, 2, 3);
printf("%d %d %d %d\n", 1, 2, 3, 4);

 

scanf는 콘솔에서 사용자의 입력을 받는 함수입니다(이제야 소개를 하지만).

이런 함수를 구현해야된다고 생각해봅시다.
인자를 받는 부분을 어떻게 해야 될까요?

이럴 때 생각해볼 수 있는 방법은 가변 인자를 사용하는 것입니다.

 

아래의 코드를 보시죠

#include <stdio.h>

void Print(int n, ...) // ... 가변인자입니다.
{
    int* pn = &n;
    for (int k = 0; k < 3; k++)
        printf("%d ", pn[k]);
    printf("\n");
}

int main()
{
    Print(1, 2, 3);
    return 0;
}

// 실행결과
// 1 2 3

그림으로 보면 아래와 같습니다.
여기서 첫 번째 변수는 꼭 선언해줘야 합니다.
첫 번째 변수를 알아야 그 뒤의 메모리 값도 알 수 있기 때문이지요!

#include <stdio.h>

void Print(int n, ...)
{
    int* pn = &n;
    for (int k = 0; k < n; k++)
        printf("%d ", pn[k]);
    printf("\n");
}

int main()
{
    Print(0);
    Print(2, 10, 100);
    Print(3, 10, 200, 3000);
    Print(4, 1, 2, 3, 4);
}
// 실행결과
// 10 100
// 10 200 3000
// 1 2 3 4

코드가 이해가 되시죠?
첫번째 변수의 주소를 배열의 이름처럼 사용하고 그다음 인자까지 접근하여 출력을 한 것입니다.

Print 함수를 Server
main 함수를 Client라 한다면

서버에선 Client가 얼만큼의 크기 만큼 가변인자를 사용할지 모르기 때문에,
사이즈가 얼만큼 있어~라고 Server에게 전달해줘야 합니다.

그래서 위의 코드 형태로 가변 인자를 사용할 수 있습니다.

자 오늘은 여기까지~

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

[27장] union  (0) 2021.10.20
[25장] main 함수의 인자전달  (0) 2021.10.18
[24장] const  (0) 2021.10.13
[23장] 파일 입출력  (0) 2021.10.12
[22장] 재귀함수  (0) 2021.10.11
Comments