C语言函数详解:参数、返回值、声明与调用

C语言函数详解:参数、返回值、声明与调用

1. 为什么需要函数

函数将一段具有独立功能的代码封装起来,可以降低重复、拆分复杂问题并提高可读性。

1
2
3
4
返回值类型 函数名(参数列表)
{
函数体;
}

2. 库函数

C标准库提供了大量通用函数:

头文件 常用函数 作用
<stdio.h> printf、scanf 输入输出
<string.h> strlen、strcpy 字符串处理
<math.h> sqrt、pow 数学运算
<stdlib.h> rand、malloc 通用工具与内存管理
1
2
3
4
5
6
7
8
9
#include <math.h>
#include <stdio.h>

int main(void)
{
double result = sqrt(16.0);
printf("%.2f\n", result);
return 0;
}

使用库函数时要包含正确头文件,并了解参数、返回值和错误约定。

3. 自定义函数

1
2
3
4
int max_value(int x, int y)
{
return x > y ? x : y;
}
  • int:返回值类型;
  • max_value:函数名;
  • x、y:形式参数;
  • return:结束函数并返回结果。

4. 形参与实参

1
2
3
4
5
6
7
8
9
10
11
12
int add(int x, int y) // x、y是形参
{
return x + y;
}

int main(void)
{
int a = 3;
int b = 5;
int sum = add(a, b); // a、b是实参
return 0;
}

C语言默认按值传递。调用函数时会把实参的值复制给形参,修改形参不会直接修改实参。

1
2
3
4
5
6
void swap_wrong(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}

如果需要修改调用者的数据,应传入地址:

1
2
3
4
5
6
void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}

5. return语句

return 有两个作用:结束当前函数;把结果返回给调用者。

1
2
3
4
5
6
int absolute(int value)
{
if (value < 0)
return -value;
return value;
}

返回值类型是 void 的函数可以使用 return; 提前结束,但不能返回具体值。

6. 数组作为函数参数

1
2
3
4
5
void print_array(const int arr[], int size)
{
for (int i = 0; i < size; ++i)
printf("%d ", arr[i]);
}

形参中的 int arr[] 本质上等价于 int *arr。因此数组长度一般需要额外传入。

7. 嵌套调用与链式访问

函数可以调用其他函数:

1
printf("%d\n", add(2, max_value(3, 5)));

链式访问是把一个函数的返回值直接作为另一个函数的参数。前提是返回值类型与目标参数类型匹配。

8. 声明与定义

函数在调用前需要让编译器知道其签名:

1
2
3
4
5
// add.h
#ifndef ADD_H
#define ADD_H
int add(int x, int y);
#endif
1
2
3
4
5
6
// add.c
#include "add.h"
int add(int x, int y)
{
return x + y;
}

声明描述“函数如何使用”,定义提供“函数如何实现”。大型项目通常把声明放在 .h,实现放在 .c。

9. 易错点

  • 函数声明与定义的参数或返回类型不一致;
  • 非 void 函数遗漏返回值;
  • 误以为按值传递可以修改实参;
  • 在被调函数中使用 sizeof(arr) 求原数组元素个数;
  • 头文件被重复包含而没有使用 include guard。

10. 总结

函数是C语言实现模块化的基本工具。重点不是记住语法,而是明确输入、输出、职责与边界,让每个函数只解决一个清晰的问题。