函数(very重点)
一、概念
一段用来执行某个功能的代码-->给你一个值,你处理完之后,再给我一个值。
※编写代码时,一定要清楚你需要实现的功能是什么?针对于功能设计出函数。
二、为什么要使用函数
1)避免使主函数main()变得复杂,逻辑混乱
2)避免程序冗长、不精炼;
3)如果需要多次实现某些功能,不使用函数的话则需要重复的话工作量大
--->模块化编程
模块化编程的特点:高聚合、低耦合-->给一段功能代码解耦能体现出你的能力
功能模块:一个或几个具有特定功能函数构成的代码
三、函数定义与使用
函数需要先定义再使用
1、函数的定义
函数四大要素
1.函数名:函数功能代码的标识符;调用函数的依据;函数名是函数的首地址(指针那块细说)
1)函数命名方式:
(1)大驼峰法:函数名内所有单词首字母大写
eg.SetStudentName
用于Windows系统
(2)下划线法:函数名内所有单词全都小写,单词之间以下划线分割
eg.set_student_name
用于Linux系统
(3)小驼峰法:函数名内第一个单词全小写,其余单词首字母大写
eg.setStudentName
用于IOS/Android系统
2.返回值:将函数的运行结果返回给调用它的函数
(1)return语句表示函数的返回结果,该语句只会执行一次
(2)函数返回值类型需要与return语句返回的数据类型匹配,否则编译错误
(3)如果函数不需要返回值,则可以将返回值类型设定void,并且可以省略return语句
3.参数列表:函数运行期间需要哪些数据参与运算
(1)参数列表内所有参数的数据类型都要给出来,不得省略
(2)如果函数不需要参数,参数列表的括号也不可以省略
4.函数体:函数运行的功能代码
也可以不定义,中进行声明,在主函数之后再进行定义:返回值类型 函数名(参数类型)
PS:功能和四大要素的关系
1.函数名是给功能代码命名
2.返回值是功能代码的结果
3.参数列表是 为了完成功能需要的起始数据
4.函数体是实现该功能的代码步骤
2、函数的使用
调用函数是函数使用的最终目的
函数调用的方式:
接受返回值的变量 = 函数名(参数列表);
注意:即使函数参数列表为空,在函数调用时参数列表的括号也可以省略。
四、概念理解:
1.主调函数 和 被调函数
主动发起函数调用的函数-->主调函数;主调函数寻找的那个函数-->被调函数
2.形式参数 和 实际参数
形参:被调函数在定义阶段,被调函数的参数列表
实参:主调函数发起调用时,主调函数传递给被调函数的值
※形参和实参需要在数量、类型、顺序上匹配
为什么形参叫形参??
形婚:只有夫妻之名,没有夫妻之实-->形参:只有参数之名,没有参数之实;如果不调用这个函数,这个函数一辈子都没有内存空间;
主调函数需要负责给被调函数分配内存空间,用完之后内存就被回收了
PS:函数调用的实质:数据的流动
3.局部变量 和 全局变量
局部变量的作用范围:仅限于当前函数的内部(形参也视为局部变量)
全局变量的作用范围:定义位置开始,直至文件的结尾-->作用:提供了另一种函数之间数据传递的方法
??局部变量与全局变量重名??(允许重名)当出现重名时,局部变量的作用范围会覆盖全局变量的作用范围
4.值传递 和 地址传递 (C++ 引用传递)
(1)值传递:
(2)地址传递
& 取地址符,给定一个变量,计算该白能量的内存地址
* 指针运算符,给定一个地址,取出该地址内存的数据
※地址传递的特点:
①主调函数传参给被调函数是地址而非变量的数值
②在被调函数内,指针的*参与运算
值传递的特点
1.传参为数值
2.除了return语句,无法将计算结果发挥主调函数
3.如果主调函数不希望被调函数修改变量的值,则应该采用值传递
地址传递的特点
1.传参为地址
2.可以将计算结果返回主调函数
3.如果主调函数希望被调函数修改变量的值,则应该采用地址传递
地址传递是除了return之外另一种被调函数将计算结果返回给主调函数的途径
五、数组传参
被调函数里的sizeof(a)/sizeof(a[0])=1
被调函数无法计算数组长度,因此主调函数需要将数组长度作为参数一并传参
PS:当指针和数组处理的是同一块内存的时候:[]<==>*
数组<==>基准点+偏移量
这就是为什么编译器不会检查数组越界的问题,只有运行起来之后你才能看!看!看!出来
语法糖:两种语法,A和B在编译时完全等价,但是A写法比B写法更加简便,那么A就是B的语法糖::[] 是 * 的语法糖
for(①;②;③){④;}<==>①;while(②){③;④;}
for 也就是 while 的语法糖
语法盐:繁杂的语法
Linux C语言高级学习第四天(C高级-函数)