函数的定义,声明,调用
定义(也叫实现),是指对函数功能的确立,包括函数名、函数返回值类型、形参、函数体。
声明(也叫原型)告诉编译器函数的参数数量、每个参数的类型以及返回值的类型。函数声明时形参名可以省略。但不建议这么做,因为形参名可以给我们提供信息。
函数调用即函数的使用 在程序中,是通过对函数的调用来执行函数体的。调用之前必须先声明,头文件的作用就在于此。
函数的返回值
函数的返回值存放在主调函数函数栈中,在被调函数退栈前传递给主调函数的。
如果返回值是地址,则要引起足够的警惕:
1.形参、局部变量的地址?
2. 是由函数malloc产生的首地址?
3.全局变量、静态变量的地址?
若是1,没有意义!函数已经退栈。
若是2,则要追踪其何时释放,是否可以合法使用。
若是3,则平安无事。只不过静态变量的作用域会受影响。
函数调用的详细过程
①跳转到代码区内函数所对应的首地址
②创建函数栈帧(分配内存空间)
③函数有参数,进行参数传递先计算实参表达式的值,再赋给形参变量。
④执行函数体
⑤返回调用点并交出计算结果,即返回值。⑥释放运行栈
递归调用很简洁,但要注意程度,防止栈溢出,尤其是嵌入式开发这种堆内存分配要求很严格的情况
数组、指针和函数的联系
数组名作函数参数时,自动退化为指针。函数得到的仅仅是数组的首地址,而不是象传值时那样拥有自己的数据存储空间。
因此主函数和子函数是对同一个数据空间(数组)进行操作,形参的任何改变会导致实参值的改变。
函数接口的两个要素是参数和返回值。
参数传递时,传什么就拷贝什么的值!