函数是一段完成特定任务的、可重复调用的代码块,它接收输入(参数)、处理逻辑、返回输出(返回值)。C语言程序由main函数(程序入口)和其他自定义函数组成,所有函数共同协作完成任务。
比如,计算两个整数的和、判断一个数是否为素数、读取用户输入等,都可以封装成函数。函数的价值在于:一次定义,多次调用,避免代码重复,降低维护成本。
函数定义需明确“做什么”(返回值类型)、“叫什么”(函数名)、“需要什么”(参数列表)和“怎么做”(函数体)。语法如下:
返回值类型 函数名(参数列表) {
// 函数体:实现功能的代码
return 返回值; // 若返回值类型为void,可省略return或写return;
} int、float、char等),也可以是void(表示函数无返回值)。void,则必须通过return语句返回一个对应类型的值;若未返回,编译器可能报警告或错误。例:
// 返回两数之和(int类型)
int add(int a, int b) {
return a + b; // 返回int类型结果
}
// 无返回值(仅打印提示)
void printHello() {
printf("Hello, Function!\n");
// 可省略return,或写return;
} add(加法)、isPrime(判断素数),提升代码可读性。类型1 参数1, 类型2 参数2, ...。void(C语言中()也表示无参数,但void更明确)。例:
// 带两个int参数的函数
int multiply(int x, int y) {
return x * y;
}
// 无参数的函数
void showTime() {
printf("Current time: %s\n", __TIME__); // 输出编译时间
} 函数体是{}内的代码块,包含变量定义、逻辑处理和return语句(若有返回值)。需注意:
函数定义后需调用才会执行,调用时需匹配函数的参数类型和数量(形参→实参)。
函数名(实参1, 实参2, ...); // 实参是传递给函数的值或变量 void),直接调用即可。例:
#include <stdio.h>
// 定义add函数(前面已举例)
int add(int a, int b) {
return a + b;
}
int main() {
int sum = add(3, 5); // 调用add,实参3和5传递给形参a和b
printf("3 + 5 = %d\n", sum); // 输出:3 + 5 = 8
printHello(); // 调用无返回值函数
return 0;
} add(int a, int b)中的a和b),是局部变量,仅在函数内有效。add(3, 5)中的3和5),类型需与形参匹配。例(值传递的特性):
void swap(int x, int y) { // 形参x、y是实参的拷贝
int temp = x;
x = y;
y = temp; // 仅修改形参,实参不变
}
int main() {
int a = 1, b = 2;
swap(a, b);
printf("a=%d, b=%d\n", a, b); // 输出:a=1, b=2(实参未交换)
return 0;
} 递归函数是在函数体内调用自身的函数,需满足两个条件:
例:用递归计算阶乘 n! = n × (n-1) × ... × 1
int factorial(int n) {
if (n == 0 || n == 1) return 1; // 基线条件:0!和1!均为1
return n * factorial(n - 1); // 递归条件:n! = n × (n-1)!
}
int main() {
printf("5! = %d\n", factorial(5)); // 输出:5! = 120
return 0;
} 数组无法直接作为函数参数传递(会退化为指针),实际传递的是数组首元素的地址。因此,函数内修改数组元素会影响原数组。
例:用函数修改数组元素
// 函数接收数组首地址和长度(需显式传长度,数组本身不携带长度信息)
void initArray(int arr[], int len) { // arr[]等价于int *arr(指针)
for (int i = 0; i < len; i++) {
arr[i] = i * 10; // 修改会影响原数组
}
}
int main() {
int nums[5] = {0};
initArray(nums, 5); // 传递数组首地址和长度
for (int i = 0; i < 5; i++) {
printf("%d ", nums[i]); // 输出:0 10 20 30 40
}
return 0;
} C语言要求函数“先定义后调用”,若函数定义在调用之后,需提前声明函数原型(告知编译器函数的返回值类型、名称和参数列表)。
声明语法:返回值类型 函数名(参数列表);(参数名可省略)。
例:
// 声明函数(参数名可省略)
int add(int, int); // 等价于int add(int a, int b);
int main() {
int sum = add(3, 5); // 调用在前,定义在后,需先声明
printf("sum = %d\n", sum);
return 0;
}
// 函数定义(在调用之后)
int add(int a, int b) {
return a + b;
} 函数是C语言模块化编程的基础,其核心价值在于:
sqrt函数);实践中需注意:
函数是C语言的“魔法盒”——输入数据,输出结果,中间隐藏复杂逻辑。掌握函数的关键在于多写多练:从简单工具函数(如求和、求最大值)到递归、数组操作,逐步体会模块化设计的魅力。熟练运用函数,你的C代码将更简洁、更易维护,也能应对更复杂的开发需求。