目录
函数是什么:
函数是用于完成特定任务的程序代码的自包含单元。
为什么使用函数:
1.可以省去重复代码的编写。
2.使程序更加模块化,有利于程序的阅读,修改和完善。
函数有自定义函数与库函数,这里主要记录自定义函数的使用,库函数的学习大伙可在http://www.cplusplus.com/ 这里学习。
1.函数的组成
C语言函数的一般形式为:
类型标识符 函数名(形参列表) //函数首部
{ 声明部分 //函数体
语句 //函数体
} //函数体
栗子:求两数最大值
int get_max(int x, int y) { if (x > y) return x; else return y; }
函数名可以自己设置,最好是有意义的,易于理解,当然也可以注释说明。
2.函数调用
(1)传值调用
#include <stdio.h> int get_max(int x, int y) { if (x > y) return x; else return y; } int main() { int a = 10; int b = 20; int max=get_max(a, b); //函数名() 为函数调用 a b为实参,向函数里面传参 printf("max=%d\n",max); return 0; }
int max=get_max(a, b);
这里a b 将会传入函数get_max里,形式参数 x y 对a b的值复制(仅仅是值的复制,地址不同),进行函数体内的语句计算,并通过return 返回,用 整型变量 max 接收 函数返回值。
传值调用 形式参数与实参的地址不同:
地址不同,因此函数处理的10和20 不是原 a b 的10和20 。
a 和 b将他们的值传给形参,形参的x y的复制a b变成了10和20。
在形参 x y 的地址里的10 20 进行运算,最后return x y的值,max接收。
(2)传址调用
当函数没有return 进行形参返回时,函数进行的只是形式参数的运算,与实参没有任何联系。
这里用交换两数的值来进行比较:
先用传值调用来运行:
#include <stdio.h> void Swap1(int x,int y) { int tem = 0; tem = x; x = y; y = tem; } int main() { int a = 10; int b = 20; Swap1(a, b); printf("a=%d b=%d\n", a, b); return 0; }
可以看到结果与我们预想的a=20,b=10不同,监视地址:
可以看到当结束运行时,我们打印的是a b的值,但交换的是x y 的值
形参的交换并没有变成实参的交换。
接下来我们用传址调用:
#include <stdio.h> void Swap2(int *pa, int *pb) { int tem = 0; tem = *pa; *pa = *pb; *pb = tem; } int main() { int a = 10; int b = 20; Swap2(&a,&b); printf("a=%d b=%d\n", a, b); return 0; }
这里我们向函数里传入地址,用指针接收,监视地址如下:
我们可以看到a b的地址与形参pa pb地址相同,且当*pa和*pb的值互换后,a b的值也发生交换,这就证明了在没有返回形参的情况下,传址调用可以让 实参与形参建立真正的联系,不再是复制为临时变量的关系。函数内部可以直接操 作函数外部的变量。
3.函数的嵌套调用
这就很简单了,就是在一个函数里面调用另一个函数 栗子:
#include <stdio.h> void line() { printf("你好\n"); } void threeline() { int i = 0; for (i = 0; i<3; i++) { line(); //循环调用三次,则打印三次 } } int main() { threeline(); return 0; }
4.函数递归
链接在这: 函数递归(套娃)_i跑跑的博客-CSDN博客 😂
5.函数的声明和定义
较短的代码用在一个源文件里没用问题,但在写长代码时,函数的声明,定义内容是分别在头文件和另一个源文件里的,声明一般出现在函数的使用之前 满足先声明后定义:
以求最大值为例: