参数

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

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 。 在该原型中定义的括号内标识符可能是相同或不同的。 什么是重要的那些在原型中的方法定义参数列表匹配参数的类型。

请参见

概念

函数调用