
注:main函数是项目必须要有的主函数,是程序的入口,启动程序时直接从main进,return结束。所以自己定义的函数如果有输出的话不进入主函数是不会显示输出的。所以就要进行函数的调用。
返回值类型:函数执行完之后,返回出一个什么类型的数据。如果需要返回一个值出去,就用return把值返回出去(return 0,return a,return...),一般return写在函数的最末尾。如果不需要返回一个值出去,那么返回值类型就可以用void,那就可以不用写return。
函数的调用

流程:从main主函数进去,执行Tn299的函数,然后再去上面寻找名为Tn299的函数执行,然后再往下就是return 0。
形参列表和实参列表
形参列表用在函数名的括号内

定义:

需要调用函数时,就用到实参

注意:碰到return(void中也一样)表示已经结束了,如果下面有代码也不会执行,跟break类似。
形参调用举例:

局部变量与全局变量
定义:

通俗解释局部变量,如下图所示:

定义了变量名一样的变量,但是程序却可以执行,是因为变量在不同的区域(花括号)内,出了这个区域变量就消逝了。

上图就是因为变量b定义在了别的区域(花括号)中,所以赋值的时候会报错。
全局变量:在区域外定义的变量!所有地方都可以用!

如果没有给全局变量赋值那么系统默认为0。
静态变量
定义:

我们的程序内存有四个区域:

静态全局区:静态数据、全局变量等。
栈区:局部变量等,栈区的内存会被自动申请和自动释放。
堆区:自己申请的内存
代码区:函数

第一回合后a=11,第二次循环的时候a没有消逝(因为a是静态变量),所以a申请内存失败,a还是11,所以执行下一条a=12...如果a是局部变量,那么就会:

函数的声明
定义:

举例:

像这种情况是会报错的,因为代码从上到下执行,在上面并未找到one函数的定义,但如果声明了,那就是可以执行的。

一般来说,可以现在最上面声明各个函数,然后再在下面对函数进行定义。(有花括号的叫函数的定义,没有花括号的叫函数的声明)

所以不能只声明不定义!!
函数的嵌套调用
重点:
1.址传递
2.数组作为函数的参数
3.函数的递归
地址:在定义变量,数组,函数等等,系统会给他们分配内存区域(地址)
&:&a 表示得到a的地址
*:定义指针变量的标识(指针也相当于是地址)
指针变量:存执地址的变量
整型变量:储存整数的变量
字符型变量:...

&a表示a的地址,所以上面表示的是将a的地址赋值给指针d。
*:也可以解引用,取内容。
所以符号*在定义的时候是指针变量,不在定义变量的时候就是解引用!!
1.址传递(形参为地址)
如果形参为数字就是值传递

&a表示a的地址,fun函数接收到地址之后就开始执行函数,占位符*d表示输入的地址被解开了,所以输出的是a的值。以上功能也就是说取谁的地址就显示该地址内部的数据。
址传递的形参可以改变实参的值!!

而值传递不能改变实参的值。
数组作为函数的参数
顾名思义就是用数组作为函数的形参。

以上的fun函数的形参就是由数组构成的,len表示数组的长度,功能就是实现输出数组中各个元素(总不能碰到一个数组就写一个for循环吧)。用数组作为形参的时候,调用时候只需要写数组名,不用写[]。
函数的递归
定义:在一个函数中,重复的调用自己本身。(自己调用自己)
例:

为什么会这样呢!!(答案来了)
:我们先是正常的程序从上往下走,i=10满足if的语句,所以执行下面的内容,i--和再次调用fun函数,所以一开始printf并未实施,所以就一直在循环if直到i等于5,然后执行printf语句,但是!(重点来了)前几次的printf都在fun函数中是肯定的会执行的,所以在循环完之后,会回调!!(把未执行的语句执行完)把之前没输出的printf输出,所以就有五个5。
例:

这种情况下的printf也会回调n的大小顺序是43210。到0之后就不会循环if语句,所以回调的顺序是1234。
例:

也是用递归做的输出的是第10个元素的值。
课后练习:
作业1:

答:

作业2:

答:

网友评论