参数

函数调用中的自变量具有此形式:


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

在函数调用中,expression-list 是表达式的列表(用逗号分隔)。 后面这些表达式的值是传递给函数的自变量。 如果函数不采用参数,则 expression-list 应包含关键字 void

自变量可以是具有基本、结构、联合或指针类型的任何值。 通过值传递所有参数。 这意味着,参数的副本将分配给对应的参数。 该函数不了解已传递的参数的实际内存位置。 该函数使用此副本,而不影响其最初派生自的变量。

虽然您无法将数组或函数作为参数传递,但可以将指针传递给这些项。 利用指针,函数可以通过引用访问值。 由于指向变量的指针包含该变量的地址,因此该函数可以使用此地址访问该变量的值。 指针参数允许函数访问数组和函数,即使数组和函数不能作为参数传递。

计算参数的顺序因不同的编译器和不同的优化级别而异。 但是,在输入函数之前,将完全计算自变量和任何副作用。 有关副作用的信息,请参阅副作用

计算函数调用中的 expression-list,并在函数调用中对每个参数执行常用算术转换。 如果原型可用,则生成的自变量类型将与原型的对应参数进行比较。 如果这些参数不匹配,则执行转换或发布诊断消息。 参数还执行常用算术转换。

除非函数的原型或定义显式指定实参的变量数目,否则 expression-list 中的表达式的数目必须与形参的数目匹配。 在这种情况下,编译器将检查与参数列表中的类型名称一样多的自变量,并根据需要转换这些自变量,如上所述。 有关详细信息,请参阅使用可变数量的参数进行调用

如果原型的参数列表只包含关键字 void,则编译器需要在函数调用和定义中使用零参数。 如果编译器找到任何参数,则会发出该诊断消息。

示例

此示例将指针用作参数:

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 函数在 main 中声明且具有两个参数,分别用标识符 num1num2 表示,二者都是指向 int 值的指针。 此外,还将原型样式定义中的参数 num1num2 声明为指向 int 类型值的指针。

在函数调用中

swap( &x, &y )  

x 的地址存储在 num1 中,而 y 的地址存储在 num2 中。 现在,这两个名称或“别名”存在于同一个位置。 对 *num1 中的 *num2swap 的引用是对 x 中的 ymain 的有效引用。 swap 中的赋值实际交换了 xy 的内容。 因此,return 语句不是必需的。

编译器对 swap 的参数执行类型检查,因为 swap 的原型包含每个参数的参数类型。 原型和定义的括号内的标识符可能相同,也可能不同。 重要的一点是,自变量的类型与原型和定义中的这些参数列表相匹配。

另请参阅

函数调用