自学嵌入式第九天(C语言篇——函数)

自学嵌入式第九天(C语言篇——函数) 一、函数实现1.函数定义类型标识符 函数名 形式参数{函数体}(1)类型标识符返回值类型说明符。这个类型说明符是用来规定返回值的类型的基本类型--整型浮点型字符型注意: 数组类型--不能做函数返回值类型说明:如果带出的结果的类型和返回值类型说明符不一致最终结果的类型以返回值类型说明符为准。返回值类型如果不写 默认相当于是int型(2)函数名是个标识符用来表示是哪个函数注意:定义符合标识符命名规则要求见名知意有字母数字下划线组成不能由数字开头不能与关键字重名不要和库函数以及预处理命令重名。(3)形式参数是函数获得数据的入口函数要处理的数据可以通过形式参数获取到。每个形参都必须指明类型即使类型相同也要分开写。形参的语法 类型 变量名1,类型 变量名2, ....说明实参到形参是赋值的过程所以要求实参和形参要求类型相同个数匹配一一对应。如果函数不需要传数据给它可以不用形参此时形参可以不写或写成void 。(4)函数体实现函数功能的那部分代码。注意:函数的定义位置一般写在main函数前面。如果写在main函数后面需要提前给编译说明一下即函数声明。复制函数头 加上分号 就是函数声明此时函数声明必须要放到使用之前。2.函数实现step1. 先根据功能 确定函数名step2. 从 输入--处理 --输出 这个模型出发考虑函数需要哪些数据以及数据的类型step3:考虑 如何处理数据 (函数体)step4:考虑 结果 要不要带回 或者输出1要带回结果考虑返回值类型说明符带出结果的语句return 表达式;2不带回结果返回值类型说明符 void (空类型)3.函数调用1语法:函数名(实际参数);2方式直接调用充当参数函数调用表达式。4.函数实现的本质函数实现调用的本质:是因为有栈空间进行了现场保护和恢复 。函数调用的实现依托进程栈内存。发起函数调用时CPU 将调用处的寄存器现场、函数返回地址、参数压入栈完成现场保护随后跳转至被调函数在栈上创建独立栈帧管理局部变量当函数执行完毕通过出栈操作恢复寄存器现场读取栈中保存的返回地址使程序回到调用位置继续执行。栈的先进后出特性天然支持多层函数嵌套调用的现场管理。二、C语言在内存中存放内存空间划分a.栈——平常定义的局部变量都是放在栈空间 局部变量的空间 是自动申请自动释放栈空间是由大小限制的当超出栈空间时会出现段错误。特点: 符合栈的先进后出的特点默认是8M但是可以更改大小。b.堆——需要程序员手动申请手动释放 数据量比较大的时候 考虑使用 特点: 大c.全局区(静态区):存放全局变量d.字符串常量区:存放字符串e.代码区:存放就是程序代码指令三、递推函数的嵌套调用:特殊的嵌套递归自己调用自己 1.直接递归f1(){f1();}2.间接递归f2(){f1();}f1(){f2();}3.递归实现逻辑int sum(int n){判断是否得到了递归结束条件是 返回 此时的结果否继续递归 下去}四、数组作为函数参数1.数组元素做函数参数a[0]2.数组本身做函数参数函数能不能访问到整个数组注意:整型的一维数组作为函数参数形参 void printArray(int a[10]) 形式上可以写成数组形式void printArray(int *a) 本质上 编译器是理解成int *指针所以如果想访问到整个数组中的数据必须还要传一个数组的长度形参void printArray(int a[10],int len) 形参需要一个数组形式的参数 一个是数组长度实参:printArray(a,len);