Linux C语言高级学习第四天(C高级-函数)

函数(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.函数体:函数运行的功能代码

也可以不定义,中进行声明,在主函数之后再进行定义:返回值类型 函数名(参数类型)

Linux C语言高级学习第四天(C高级-函数)_第1张图片

PS:功能和四大要素的关系

1.函数名是给功能代码命名

2.返回值是功能代码的结果

3.参数列表是    为了完成功能需要的起始数据

4.函数体是实现该功能的代码步骤

2、函数的使用

调用函数是函数使用的最终目的

函数调用的方式:

接受返回值的变量 = 函数名(参数列表);

注意:即使函数参数列表为空,在函数调用时参数列表的括号也可以省略。

四、概念理解:

1.主调函数 和 被调函数

    主动发起函数调用的函数-->主调函数;主调函数寻找的那个函数-->被调函数

2.形式参数 和 实际参数

    形参:被调函数在定义阶段,被调函数的参数列表

    实参:主调函数发起调用时,主调函数传递给被调函数的值

※形参和实参需要在数量、类型、顺序上匹配

为什么形参叫形参??

形婚:只有夫妻之名,没有夫妻之实-->形参:只有参数之名,没有参数之实;如果不调用这个函数,这个函数一辈子都没有内存空间;    

主调函数需要负责给被调函数分配内存空间,用完之后内存就被回收了

PS:函数调用的实质:数据的流动

Linux C语言高级学习第四天(C高级-函数)_第2张图片

3.局部变量 和 全局变量

局部变量的作用范围:仅限于当前函数的内部(形参也视为局部变量)

全局变量的作用范围:定义位置开始,直至文件的结尾-->作用:提供了另一种函数之间数据传递的方法

??局部变量与全局变量重名??(允许重名)当出现重名时,局部变量的作用范围会覆盖全局变量的作用范围

4.值传递 和 地址传递    (C++  引用传递)

(1)值传递:

Linux C语言高级学习第四天(C高级-函数)_第3张图片

(2)地址传递

&    取地址符,给定一个变量,计算该白能量的内存地址

*      指针运算符,给定一个地址,取出该地址内存的数据

Linux C语言高级学习第四天(C高级-函数)_第4张图片

※地址传递的特点:

①主调函数传参给被调函数是地址而非变量的数值

②在被调函数内,指针的*参与运算

Linux C语言高级学习第四天(C高级-函数)_第5张图片

值传递的特点

1.传参为数值

2.除了return语句,无法将计算结果发挥主调函数

3.如果主调函数不希望被调函数修改变量的值,则应该采用值传递

地址传递的特点

1.传参为地址

2.可以将计算结果返回主调函数

3.如果主调函数希望被调函数修改变量的值,则应该采用地址传递

地址传递是除了return之外另一种被调函数将计算结果返回给主调函数的途径

五、数组传参

被调函数里的sizeof(a)/sizeof(a[0])=1

Linux C语言高级学习第四天(C高级-函数)_第6张图片Linux C语言高级学习第四天(C高级-函数)_第7张图片

被调函数无法计算数组长度,因此主调函数需要将数组长度作为参数一并传参

PS:当指针和数组处理的是同一块内存的时候:[]<==>*

数组<==>基准点+偏移量

这就是为什么编译器不会检查数组越界的问题,只有运行起来之后你才能看!看!看!出来

语法糖:两种语法,A和B在编译时完全等价,但是A写法比B写法更加简便,那么A就是B的语法糖::[]  是 * 的语法糖

for(①;②;③){④;}<==>①;while(②){③;④;}

for 也就是 while 的语法糖

语法盐:繁杂的语法

Linux C语言高级学习第四天(C高级-函数)

你可能感兴趣的:(Linux)