C 语言函数详解:定义、声明、调用与参数传递
函数是一组共同完成任务的语句。每个 C 程序至少有一个函数 main(),简单程序可定义额外函数。
可将代码分割到不同函数。如何分割由你决定,但逻辑上每个函数应执行特定任务。
函数声明告知编译器函数名、返回类型和参数。函数定义提供函数实际主体。
C 标准库提供许多内置函数,如 strcat() 连接字符串、memcpy() 复制内存等。
函数也称为方法、子程序或过程等。
定义函数
C 语言函数定义通用形式:
return_type function_name( parameter list ) { body of the function }
函数定义包含函数头和函数体。函数各部分:
- 返回类型 - 函数可返回值。return_type 是返回值的数据类型。某些函数执行操作无返回值,此时 return_type 为关键字 void。
- 函数名 - 函数实际名称。函数名和参数列表共同构成函数签名。
- 参数 - 参数如占位符。调用函数时向参数传值,称为实际参数或实参。参数列表指参数类型、顺序和数量。参数可选,函数可无参数。
- 函数体 - 包含定义函数功能的语句集合。
示例
下面是 max() 函数源码,接受两个参数 num1、num2 返回最大值:
/* function returning the max between two numbers */ int max(int num1, int num2) { /* local variable declaration */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
函数声明
函数声明告知编译器函数名及调用方式。函数实际主体可单独定义。
函数声明包含:
return_type function_name( parameter list );
上述 max() 函数声明为:
int max(int num1, int num2);
参数名在声明中不重要,只需类型,故以下也合法:
int max(int, int);
当在一个源文件定义函数而在另一文件调用时需要函数声明。此时应在调用文件顶部声明函数。
调用函数
创建 C 函数时定义其功能。使用函数需调用它执行既定任务。
程序调用函数时,控制权转移到被调函数。被调函数执行任务,遇到 return 语句或函数结束右括号时将控制权返回主程序。
调用函数只需传递所需参数及函数名,若函数返回值可存储返回值。例如:
Live Demo
#include <stdio.h> /* function declaration */ int max(int num1, int num2); int main () { /* local variable definition */ int a = 100; int b = 200; int ret; /* calling a function to get max value */ ret = max(a, b); printf( "Max value is : %d\n", ret ); return 0; } /* function returning the max between two numbers */ int max(int num1, int num2) { /* local variable declaration */ int result; if (num1 > num2) result = num1; else result = num2; return result; }
将 max() 与 main() 放一起编译运行,输出:
Max value is : 200
函数参数
若函数使用参数,必须声明接受实参值的变量,称为函数的形式参数。
形式参数在函数内表现为局部变量,进入函数时创建,退出时销毁。
调用函数时,实参传递方式有两种:
| 序号 | 调用类型及说明 |
|---|---|
| 1 | 值传递 将实参实际值复制给函数形式参数。函数内修改参数不影响实参。 |
| 2 | 引用传递 将实参地址复制给形式参数。函数内通过地址访问实参,修改参数会影响实参。 |
C 语言默认使用值传递。通常意味着函数内代码不能改变调用时使用的实参。
C语言