参数

在的参数函数调用具有此窗体:

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

在函数调用, 表达式列表 是表达式列表 (以逗号分隔)。这些后表达式的值是传递给函数。如果函数不接受参数, 请表达式列表 应包含关键字 void。

参数可能与基础知识、结构、联合或指针类型的所有值。所有通过值传递实参。这意味着参数的副本将分配给对应的参数。函数不知道传递的参数的物理内存位置。函数使用此副本,而不影响其最初派生的变量。

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

参数的计算顺序可能有所不同在不同的编译器和不同的优化级别下。但是,在中,在函数中输入之前,参数和任何副作用完全计算。有关副作用的信息,请参见 副作用

在的 表达式列表 函数调用进行计算,并正常算术转换在每个参数执行在函数调用。如果原型可用,发生的参数类型与原型的相应参数进行比较。如果不匹配,或者将完成,或者一个诊断消息问题。参数还通过通常算术转换。

,除非函数的原型或定义中显式指定参数,数目可变表达式的数目 表达式列表 必须与参数的数目。在这种情况下,编译器上述检查参数太多,尽管具有在参数列表的类型名称,并根据需要将它们,。请参见 调用带有参数数目可变 有关更多信息。

如果原型的参数列表只包含关键字 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 声明具有两个参数,分别表示标识符 num1 和 num2,二者都是指向 int 值。在该原型样式定义的参数 num1 和 num2 同时声明为指向 int 类型值。

在函数调用

swap( &x, &y )

x 地址。 num1 中,它 y 地址。 num2存储。现在两个名称或别名 “,”为同一位置。对 *num1 ,并在 swap 的 *num2 有效对 x 和 y 在 main。在 swapswap 分配实际交换 x 和 y内容。因此, return 语句不是必需的。

,因为 swap 此原型包括的每个参数,参数类型执行类型检查参数的编译器。 swap 。在该原型中定义的括号内标识符可能是相同或不同的。什么是重要的那些在原型中的方法定义参数列表匹配参数的类型。

请参见

概念

函数调用