C 语言函数
函数是一组一起执行一个任务的语句块。
每个 C 程序都至少有一个函数,即主函数 main()。
我们还可以自己定义其他额外的函数。
划分代码到函数中
我们可以把代码划分到不同的函数中,这样可以使得代码可读性更强,逻辑更简单。
虽然划分代码到不同的函数中没有一个统一的规范,但实践证明,在逻辑上,划分的标准是每个函数执行一个特定的任务的。
函数
函数的声明和定义:
- 函数 声明 告诉编译器函数的
名称
、返回类型
和参数
。 - 函数 定义 提供了函数的
实际主体
。
当然了,我们可以把函数的声明和定义放在一起,因为,函数只有一条规则:
调用函数前,函数必须被声明,是否被定义则是没要求的。
C 标准库 提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
函数还有很多叫法: 方法
、子例程
或 程序
等等。
定义函数
C 语言中的函数定义的一般语法格式如下:
return_type function_name( parameter list ) { body of the function }
在 C 语言中,函数由一个 函数头
和一个 函数主体
组成。
一个函数至少由以下几部分组成:
-
return_type: 返回类型,一个函数可以返回一个值。 return_type 是函数返回的值的数据类型。 有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
-
函数名称: 这是函数的实际名称。函数名和参数列表一起构成了函数签名。
-
参数: 参数就像是占位符。 当函数被调用时,您向参数传递一个值,这个值被称为实际参数。 参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
-
函数主体: 函数主体包含一组定义函数执行任务的语句。
范例: C 语言函数定义语法说明
我们来声明和定义一个名为 max
的函数,它有两个 int
类型的参数 num1
和 num2
。
这个 max
函数会返回两个参数中比较大的那个,所以,返回值类型为 int
。
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> // 声明 max 函数 int max(int num1,int num2); int main () { return 0; } // 定义 max 函数 int max(int num1,int num2) { // 使用三元运算符 return num1 - num2 > 0 ? num1 : num2; }
函数声明
函数 声明 是告诉编译器和开发者函数的名称及如何调用函数。
函数的实际主体可以单独定义。
函数声明包括以下几个部分:
return_type function_name( parameter list );
针对上面定义的函数 max(),以下是函数声明:
int max(int num1, int num2);
在函数声明中,参数的名称并不重要,只有参数的类型是必需的,
因此下面也是有效的声明:
int max(int, int);
当我们在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。 在这种情况下,我们应该在调用函数的文件顶部声明函数。
调用函数
如果声明一个函数,同时也定义了一个函数,那么接下来就是要调用这个函数完成一个任务。
创建 C 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。
被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。
范例: 声明,定义,调用函数
/** * file: main.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> // 声明 max 函数 int max(int num1,int num2); int main () { int a = 17; int b = 5; int c; c = max(a,b); //调用函数 printf("%d 与 %d 中 %d 比较大\n",a, b, c); printf(" -1 与 1 中 %d 比较大\n",max(-1,1) ); //可以直接传递类型字面量给函数,函数的返回值也可以作为其它函数的参数 return 0; } // 定义 max 函数 int max(int num1,int num2) { // 使用三元运算符 return num1 - num2 > 0 ? num1 : num2; }
编译和运行以上程序,输出结果如下
$ gcc main.c && a.out 17 与 5 中 17 比较大 -1 与 1 中 1 比较大
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的 形式参数 。
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
调用类型 | 描述 |
---|---|
传值调用 | 该方法把参数的实际值复制给函数的形式参数。 在这种情况下,修改函数内的形式参数不会影响实际参数 |
引用调用 | 通过指针传递方式,形参为指向实参地址的指针 当对形参的指向操作时,就相当于对实参本身进行的操作 |
默认情况下,C 使用 传值调用
来传递参数。
这意味着函数内的代码不能改变用于调用函数的实际参数。