概述
一 函数的基础语法(函数定义 调用 声明)
二 函数的注意事项(传值 返回值)
小知识:
面向结构程序面临三个缺点 (移植性 扩展性 维护性不好)
一 函数的基础语法
函数三要素 (函数名 函数形参 函数返回值)
函数使用的形式 (声明 定义 调用)
在调用函数前需声明函数
小知识:在声明中加上extern关键字 会在外部文件中查找函数的编译 不写会默认为函数在当前文件编译
函数声明 包括函数名 返回值和形参类型
注意 可以只写形参类型而不写变量名 因为 声明不分配内存空间 所以不绑定变量名
函数名
需要体现自注释性 以提高代码的可读性 推荐 动词—名词 搭配 参数一般不超过 four
返回值
一开始不清楚返回类型时先写void 待最后写return时 再做校正
小知识: exit vs return
exit(1);是一个函数 结束整个程序 返回系统
return 返回调用函数
main里的return 0;交代系统程序为正常退出 不然系统还要检查正异常退出情况 系统会很忙
函数注意事项
函数的传参
传值 vs 传地址
传值: 传实参变量名(只能使用不能修改实参) 当只使用不修改实参变量内存空间的值时 在函数调用时传递实参变量名
传地址: 传实参变量地址(既能使用又能修改实参)当既使用又修改实参变量内存空间的值 在函数调用时 传实参地址
函数调用过程
1 找到函数地址
函数地址 == 函数人口地址 == &函数名(函数名也是一个指针 保存函数地址)
2 给形参分配空间
3 传参 将实参的值传递给形参的空间储存
4 执行函数体里的语句
5 函数返回值 并释放空间(函数的空间:局部变量)
思考:
以上操作会提示段错误 因为形参里分配的空间在函数调用后就释放掉了 实际的实参并未分得空间
传出参数和传入参数
传入参数: 传递给函数只使用不修改实参
传出参数: 传递给函数并可以修改实参的值(相当于函数的返回值)
思考:
函数如何返回多个值
(利用传出参数)(利用结构体传出参数)
小提示
传指针给形参时 不要误认为就是在传地址 要判断 是修改指针变量对应内存空间的值(传指
针变量地址) 还是要修改指针变量指向内存空间的值(传指针变量名)
命令行参数
主函数参数{int argc,int*argv[] } 主程序调用时后跟的参数为传入main的参数
argc 即argument count 统计参数个数 注意 把命令本身也统计一次
函数入口参数检查
重要知识点
函数返回值 不能返回局部变量的地址
原因
函数局部变量数组在栈空间开辟字节地址 当返回时返回首字节地址 当函数执行完后 一返回
就会将局部变量字节地址空间释放掉
栈空间特点
生命周期只在函数体里 执行完释放 所以主函数里 *p 会指向无效空间 因此出现段错误
解决办法 加上 static 将生命周期延长至整个程序结束之后释放 才可以返回局部变量的地址