C语言中的函数调用是指程序执行过程中跳转到指定函数内部执行对应逻辑,执行完成后再返回到调用位置继续后续代码的过程,合理的函数调用能够让代码结构更清晰、复用性更高。

函数调用的前置条件
在调用函数之前,需要先完成函数的定义或者声明,否则编译器会提示未定义的错误。函数定义是写出函数的完整实现逻辑,函数声明则是告诉编译器函数的存在以及对应的参数、返回值类型。
函数定义示例
// 定义一个计算两个整数之和的函数
int add(int a, int b) {
int sum = a + b;
return sum; // 返回计算结果
}
函数声明示例
如果函数在调用位置之后才定义,就需要在调用之前做声明,声明格式为返回值类型 函数名(参数类型列表);,比如上面的add函数声明可以写成:
int add(int a, int b); // 函数声明,参数名可以省略,写成int add(int, int);也合法
基本函数调用方法
函数调用的基本格式是函数名(实际参数列表),如果是有返回值的函数,可以把调用结果赋值给对应类型的变量,也可以直接作为表达式的一部分使用。
#include <stdio.h>
// 函数声明
int add(int a, int b);
int main() {
// 调用add函数,传入实际参数3和5,将返回值赋值给result变量
int result = add(3, 5);
printf("3和5的和是:%dn", result); // 输出结果:3和5的和是:8
// 函数调用结果直接作为printf的参数使用
printf("2和4的和是:%dn", add(2, 4)); // 输出结果:2和4的和是:6
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
不同参数传递方式的调用
C语言函数调用时的参数传递分为值传递和地址传递两种,这两种方式的调用逻辑和效果有明显区别。
值传递调用
值传递是把实际参数的数值拷贝一份传给函数的形式参数,函数内部修改形式参数不会影响原来的实际参数。
#include <stdio.h>
// 值传递函数,尝试修改传入的参数
void changeValue(int x) {
x = 100; // 修改形式参数x的值
printf("函数内部x的值:%dn", x);
}
int main() {
int num = 10;
changeValue(num); // 调用函数,传入num的值
printf("函数调用后num的值:%dn", num); // 输出:函数调用后num的值:10,原变量未被修改
return 0;
}
地址传递调用
地址传递是把实际参数的内存地址传给函数,函数通过指针访问并修改该地址对应的内容,会直接影响原来的实际参数。
#include <stdio.h>
// 地址传递函数,通过指针修改传入的变量值
void changeValue(int *x) {
*x = 100; // 修改指针指向地址的内容
printf("函数内部*x的值:%dn", *x);
}
int main() {
int num = 10;
changeValue(&num); // 调用函数,传入num的地址
printf("函数调用后num的值:%dn", num); // 输出:函数调用后num的值:100,原变量被修改
return 0;
}
无返回值函数的调用
如果函数定义时返回值类型为void,表示函数没有返回值,调用时不需要接收返回值,直接写函数调用语句即可。
#include <stdio.h>
// 无返回值函数,打印问候语
void sayHello(char *name) {
printf("你好,%s!n", name);
}
int main() {
sayHello("张三"); // 直接调用无返回值函数
sayHello("李四");
return 0;
}
函数调用的常见注意事项
- 调用函数时传入的实际参数个数、类型要和函数定义/声明的参数列表匹配,否则会出现编译错误或者运行时异常。
- 函数可以调用自身,这种调用方式叫做递归调用,但递归需要设置正确的终止条件,否则会导致栈溢出。
- 如果函数没有在调用前声明也没有在调用前定义,编译器会默认函数的返回值是int类型,不符合实际定义时会出现错误。
- 实际参数可以是常量、变量、表达式,只要其结果类型和形式参数匹配即可。
递归调用示例
下面是一个计算阶乘的递归函数调用示例,展示函数调用自身的用法:
#include <stdio.h>
// 递归函数计算n的阶乘
int factorial(int n) {
if (n == 1) { // 递归终止条件
return 1;
}
return n * factorial(n - 1); // 调用自身
}
int main() {
int num = 5;
printf("%d的阶乘是:%dn", num, factorial(num)); // 输出:5的阶乘是:120
return 0;
}