1 函数的使用目的
当我将某一个功能封装成一个函数的时候,那么我修改该功能的时候,只需要修改该函数。
如果程序中,该功能出现若干次,那么我只要修改一次函数,所有功能实现处都会改变。
即,函数提高了我的代码的重构效率,指提高了工作效率。提高了代码的重用性。
注: 函数中功能的覆盖性可以广泛。但是函数的功能越单一越好。
举例说明: 一个函数,如果是用来验证是否为质数,那么只验证是否为质数,不输出。
2 函数的定义
将某一个特定的功能,打包封装后,称为函数。那么在该函数外部,如果需要实现这个特定功能,只需要调用封装好的函数即可。
3 函数的三要素
3.1 函数名
一个函数的名字,注意,在C语言中,函数名绝对不能重复。
3.2 函数返回值类型:
什么叫函数的返回值:如同所有的表达式都会得到一个运算结果。那么对于函数,当发生调用函数时,调用函数的语句就是一个表达式,这个表达式得到的运算结果,仅仅取决于函数的返回值(如果我们想将一个特定的值给到函数表达式本身。那么只要在return后面写上该特定值,当函数调用完成后,函数表达式本身的值就是该特定值)。
3.3 函数的参数列表:
一个函数在运算过程中,如果需要使用外部的变量,则可能通过参数列表的形式,来得到这个外部变量的值。
注意:
- 函数定义的时候,参数列表称为形参。
- 函数调用的时候,参数列表称为实参。
- 发生函数调用的时候,会将实参的值赋值给形参。
- 函数调用完成时,形参并不会赋值给实参。而是会将返回值赋值给函数表达式本身
- 可变参数函数:参数的数量根据实际需求,动态改变。
但是注意:无论怎么改变,必须有一个固定参数(第一个参数)。
可变参数的函数使用:
关闭回显system(“sty -echo”);
//函数会将输入的字符在终端上执行。
打开回显system(“stty echo”);
使用system函数时 需要使用#include<stdlib.h>
4 递归函数
函数自己调用自己
递归函数的3要素:
- 自己调用自己
- 要有明确的退出点,否则就会造成栈溢出
- 每一次递归,必须逐渐趋近于递归退出点。
递归的思想: 在某些复杂的问题中,我们并不知道这个问题的解是多少。此时可以将该问题分解成逻辑相似的简单问题去解决。如果这个简单的问题依旧无法解决,继续分解。当分散到最低层的时候,我们需要给最低层问题一个确切的解。此时由于最低层已经解决,那么依赖于低层问题的上一层问题也能解决,依次逐层向上解决,直到解决最高层问题为止。
注意: 在递归函数中,严禁使用static.如果递归函数中使用static变量来完成逻辑计算,那么当你第一次递归函数的时候,能够算出正确的结果。但是当第二次调用这个递归函数的时候,结果肯定是错误的。
递归和循环的区别:
循环在时间复杂度上会很高,但是其空间复杂度一定会很低。
递归在空间复杂度上会很高,但是其在时间复杂度上不一定会低。当设计合理时,递归的时间复杂度会非常非常的低。
对一个地址(一个十六进制的数)前面加上‘*’,代表着系统会跑到该地址上,将该地址值上的值取出来使用。
例如: 0x01
上保存的值为 2
此时,我有一个地址变量 p=0x01
那么,此时,*p=2
;
程序的分文件:
第一步,编写相关头文件(.h)
示例代码:
#ifndef _head_h
#define _head_h
#include<stdio.h>
int add(int a,int b); //函数原型
#endif
第二步,在主文件中包含相关自定义的头文件(main所在函数中)
#include”head.h”
第三步,编写函数实现文件(.c)
#include”head.h”
int add(int a,int b){ retrun a+b;}