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