인수Arguments

함수 호출의 인수는 다음과 같은 형식입니다.The arguments in a function call have this form:


expression  
(  
expression-list <SUB>opt</SUB> )  /* Function call */  

함수 호출에서 식 목록은 쉼표로 구분된 식 목록입니다.In a function call, expression-list is a list of expressions (separated by commas). 두 번째 식의 값은 함수로 전달되는 인수입니다.The values of these latter expressions are the arguments passed to the function. 함수에서 인수가 사용되지 않으면 식 목록에는 void 키워드를 포함해야 합니다.If the function takes no arguments, expression-list should contain the keyword void.

인수는 기본, 구조체, 공용 구조체 또는 포인터 형식의 모든 값일 수 있습니다.An argument can be any value with fundamental, structure, union, or pointer type. 모든 인수는 값으로 전달됩니다.All arguments are passed by value. 즉, 인수의 복사본이 해당 매개 변수에 할당됩니다.This means a copy of the argument is assigned to the corresponding parameter. 함수는 전달된 인수의 실제 메모리 위치를 알 수 없습니다.The function does not know the actual memory location of the argument passed. 함수는 복사본이 원래 파생된 변수에 영향을 주지 않고 해당 복사본을 사용합니다.The function uses this copy without affecting the variable from which it was originally derived.

배열이나 함수를 인수로 전달할 수는 없지만 포인터를 이러한 항목으로 전달할 수는 있습니다.Although you cannot pass arrays or functions as arguments, you can pass pointers to these items. 함수는 포인터를 통해 참조로 값에 액세스할 수 있습니다.Pointers provide a way for a function to access a value by reference. 변수에 대한 포인터에는 변수의 주소가 포함되므로 함수는 이 주소를 사용해 변수의 값에 액세스할 수 있습니다.Since a pointer to a variable holds the address of the variable, the function can use this address to access the value of the variable. 배열 및 함수를 인수로 전달할 수는 없지만 포인터 인수를 사용하면 함수가 배열 및 함수에 액세스할 수 있습니다.Pointer arguments allow a function to access arrays and functions, even though arrays and functions cannot be passed as arguments.

인수를 평가하는 순서는 컴파일러 및 최적화 수준에 따라 달라질 수 있습니다.The order in which arguments are evaluated can vary under different compilers and different optimization levels. 그러나 함수를 입력하기 전에 인수 및 해당 인수의 의도하지 않은 결과를 완전하게 평가합니다.However, the arguments and any side effects are completely evaluated before the function is entered. 이와 같은 파생 작업에 대한 자세한 내용은 파생 작업을 참조하세요.See Side Effects for information on side effects.

함수 호출의 식 목록을 평가한 다음 해당 함수 호출의 각 인수에 대해 일반적인 산술 변환을 수행합니다.The expression-list in a function call is evaluated and the usual arithmetic conversions are performed on each argument in the function call. 프로토타입을 사용할 수 있으면 결과 인수 형식을 프로토타입의 해당 매개 변수와 비교합니다.If a prototype is available, the resulting argument type is compared to the prototype's corresponding parameter. 인수 형식과 매개 변수가 일치하지 않으면 변환이 수행되거나 진단 메시지가 표시됩니다.If they do not match, either a conversion is performed, or a diagnostic message is issued. 매개 변수에 대해서도 일반적인 산술 변환이 진행됩니다.The parameters also undergo the usual arithmetic conversions.

함수의 프로토타입 또는 정의에 인수의 변수 수가 명시적으로 지정되는 경우가 아니면 식 목록의 식 수는 매개 변수의 수와 일치해야 합니다.The number of expressions in expression-list must match the number of parameters, unless the function's prototype or definition explicitly specifies a variable number of arguments. 변수의 수가 명시적으로 지정되는 경우에는 컴파일러가 매개 변수 목록에 있는 형식 이름의 수에 해당하는 인수를 확인한 다음 필요한 경우 위에서 설명한 것처럼 변환합니다.In this case, the compiler checks as many arguments as there are type names in the list of parameters and converts them, if necessary, as described above. 자세한 내용은 가변적인 개수의 인수를 사용하여 호출을 참조하세요.See Calls with a Variable Number of Arguments for more information.

프로토타입의 매개 변수 목록에 void 키워드만 포함되어 있으면 컴파일러는 함수 호출의 인수 수와 정의의 매개 변수 수를 0으로 가정합니다.If the prototype's parameter list contains only the keyword void, the compiler expects zero arguments in the function call and zero parameters in the definition. 인수가 발견되면 진단 메시지가 표시됩니다.A diagnostic message is issued if it finds any arguments.

Example

이 예제에서는 포인터를 인수로 사용합니다.This example uses pointers as arguments:

int main()  
{  
    /* Function prototype */  

    void swap( int *num1, int *num2 );  
    int x, y;  
    .  
    .  
    .  
    swap( &x, &y );  /* Function call */  
}  

/* Function definition */  

void swap( int *num1, int *num2 )  
{  
    int t;  

    t = *num1;  
    *num1 = *num2;  
    *num2 = t;  
}  

이 예제에서는 swap 함수가 각각 mainnum1 식별자로 표시되는 인수 두 개를 포함하도록 num2에서 선언됩니다. 이 두 식별자는 모두 int 값에 대한 포인터입니다.In this example, the swap function is declared in main to have two arguments, represented respectively by identifiers num1 and num2, both of which are pointers to int values. 프로토타입 스타일 정의의 num1num2 매개 변수도 int 형식 값에 대한 포인터로 선언됩니다.The parameters num1 and num2 in the prototype-style definition are also declared as pointers to int type values.

다음 함수 호출에서In the function call

swap( &x, &y )  

x의 주소는 num1에 저장되고 y의 주소는 num2에 저장됩니다.the address of x is stored in num1 and the address of y is stored in num2. 즉, 같은 위치에 대해 두 개의 이름("별칭")이 있습니다.Now two names, or "aliases," exist for the same location. *num1*num2swap에 대한 참조는 사실상 xymain에 대한 참조입니다.References to *num1 and *num2 in swap are effectively references to x and y in main. swap 내의 할당은 실제로 xy의 내용을 교환합니다.The assignments within swap actually exchange the contents of x and y. 따라서 return 문은 필요하지 않습니다.Therefore, no return statement is necessary.

swap의 프로토타입에 각 매개 변수에 대한 인수 형식이 포함되므로 컴파일러는 swap에 대한 인수에서 형식 검사를 수행합니다.The compiler performs type checking on the arguments to swap because the prototype of swap includes argument types for each parameter. 프로토타입과 정의의 괄호 안에 포함된 식별자는 같을 수도 있고 다를 수도 있습니다.The identifiers within the parentheses of the prototype and definition can be the same or different. 중요한 것은 인수의 형식이 프로토타입과 정의 둘 다의 매개 변수 목록에 포함된 형식과 일치한다는 점입니다.What is important is that the types of the arguments match those of the parameter lists in both the prototype and the definition.

참고 항목See Also

함수 호출Function Calls