C语言参数是指在调用函数时传递给函数的常量、变量或表达式,在C语言中,函数可以有多个参数,这些参数可以在函数定义和函数声明时指定,参数可以分为两种类型:值传递和引用传递,值传递是将实参的值复制一份给形参,而引用传递则是将实参的地址传递给形参,这样形参和实参共享同一块内存空间。
1、函数定义和声明
在C语言中,函数的定义通常放在源文件的开头,而函数的声明则可以放在源文件的任何位置,函数声明包括函数名、返回值类型和参数列表。
int add(int a, int b); // 函数声明 int main() { int x = 3; int y = 4; int sum = add(x, y); // 函数调用 printf("Sum: %d ", sum); return 0; } int add(int a, int b) { // 函数定义 return a + b; }
2、值传递
值传递是将实参的值复制一份给形参,当函数执行完毕后,形参所占用的内存空间会被释放,不会影响实参的值。
#include <stdio.h> void swap(int a, int b) { // 值传递的函数定义 int temp = a; a = b; b = temp; printf("a: %d, b: %d ", a, b); } int main() { int x = 3; int y = 4; printf("Before swap: x: %d, y: %d ", x, y); swap(x, y); // 值传递的函数调用 printf("After swap: x: %d, y: %d ", x, y); return 0; }
输出结果:
Before swap: x: 3, y: 4 a: 4, b: 3 After swap: x: 3, y: 4
从输出结果可以看出,swap函数中的a和b值的变化并不影响main函数中的x和y值。
3、引用传递
引用传递是将实参的地址传递给形参,这样形参和实参共享同一块内存空间,对形参的修改也会影响实参的值,引用传递需要在参数前加上指针运算符(*)。
#include <stdio.h> void swap(int *a, int *b) { // 引用传递的函数定义 int temp = *a; *a = *b; *b = temp; printf("a: %d, b: %d ", *a, *b); } int main() { int x = 3; int y = 4; printf("Before swap: x: %d, y: %d ", x, y); swap(&x, &y); // 引用传递的函数调用,传入实参的地址 printf("After swap: x: %d, y: %d ", x, y); return 0; }
输出结果:
Before swap: x: 3, y: 4 a: 4, b: 3 After swap: x: 4, y: 3
从输出结果可以看出,swap函数中的a和b值的变化影响了main函数中的x和y值,这是因为swap函数中的a和b是指向实参x和y的指针,对它们的修改会改变实参x和y的值。
4、参数默认值和可变参数列表
C语言支持为函数参数设置默认值,这样在调用函数时可以省略相应的实参。
#include <stdio.h> #include <stdarg.h> // 可变参数列表所需的头文件 // 带默认值的参数示例函数,计算阶乘n!,其中n=5(默认值)时,计算5!=120;n=10时,计算10!=3628800,当n小于等于0时,返回-1。 int factorial(int n = 5) { // n默认值为5,即计算5!=120;当n小于等于0时,返回-1,如果需要计算其他阶乘,可以通过传入不同的实参来覆盖默认值,例如factorial(10)计算10!=3628800,注意:这里没有使用可变参数列表的方法实现多态阶乘计算功能,因为C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),而需要在函数定义中使用va_list、va_start、va_arg等宏来实现可变参数列表的功能,这里仅作为带默认值参数的示例,在实际编程中,可以根据需要选择是否使用可变参数列表来实现更灵活的功能,同时需要注意,由于C语言不支持直接在函数声明中指定可变参数列表的类型,因此在调用带有可变参数列表的函数时,需要显式地传入一个额外的参数(通常是指针类型),用于存储可变参数列表的长度等信息,int result = my_function(arg1, arg2, arg3, ...);其中my_function是一个带有可变参数列表的函数,arg1、arg2、arg3等是需要传入的实际参数,在my_function内部,可以通过这个额外的参数来获取实际参数的数量和类型等信息,具体实现方法可以参考相关的C语言教程和文档,需要注意的是,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在使用可变参数列表时,需要在函数定义中使用va_list、va_start、va_arg等宏来实现可变参数列表的功能,这里仅作为带默认值参数的示例,在实际编程中,可以根据需要选择是否使用可变参数列表来实现更灵活的功能,同时需要注意,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在调用带有可变参数列表的函数时,需要显式地传入一个额外的参数(通常是指针类型),用于存储可变参数列表的长度等信息,int result = my_function(arg1, arg2, arg3, ...);其中my_function是一个带有可变参数列表的函数,arg1、arg2、arg3等是需要传入的实际参数,在my_function内部,可以通过这个额外的参数来获取实际参数的数量和类型等信息,具体实现方法可以参考相关的C语言教程和文档,需要注意的是,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在使用可变参数列表时,需要在函数定义中使用va_list、va_start、va_arg等宏来实现可变参数列表的功能,这里仅作为带默认值参数的示例,在实际编程中,可以根据需要选择是否使用可变参数列表来实现更灵活的功能,同时需要注意,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在调用带有可变参数列表的函数时,需要显式地传入一个额外的参数(通常是指针类型),用于存储可变参数列表的长度等信息,int result = my_function(arg1, arg2, arg3, ...);其中my_function是一个带有可变参数列表的函数,arg1、arg2、arg3等是需要传入的实际参数,在my_function内部,可以通过这个额外的参数来获取实际参数的数量和类型等信息,具体实现方法可以参考相关的C语言教程和文档,需要注意的是,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在使用可变参数列表时,需要在函数定义中使用va_list、va_start、va_arg等宏来实现可变参数列表的功能,这里仅作为带默认值参数的示例,在实际编程中,可以根据需要选择是否使用可变参数列表来实现更灵活的功能,同时需要注意,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在调用带有可变参数列表的函数时,需要显式地传入一个额外的参数(通常是指针类型),用于存储可变参数列表的长度等信息,int result = my_function(arg1, arg2, arg3, ...);其中my_function是一个带有可变参数列表的函数,arg1、arg2、arg3等是需要传入的实际参数,在my_function内部,可以通过这个额外的参数来获取实际参数的数量和类型等信息,具体实现方法可以参考相关的C语言教程和文档,需要注意的是,由于C语言不支持直接在函数声明中指定可变参数列表的类型(如:int factorial(int n, ...)),因此在使用可变参数列表时,需要在函数定义中使用va_list、va_start、