现在进入第五章函数函数章节的学习
无参数函数与有参数函数的定义和使用
void的且没有返回值(return)叫做无参数函数
有参数有返回值的叫做有参数函数(有返回值)
定义一个三个数相加的函数并调用
函数的内存、还有形式参数和实际参数的区别 函数被调用的时候才会申请地址并存储在栈空间,调用结束后会被系统释放
函数调用例题:编写函数求两个数的最大值
这边将if else的判断语句进行优化 选择三目运算符(目的简化代码)
函数的嵌套(这边是计算4个数中最大的数)全部数据和算法可以自己设计,懂得怎么设计就好
函数递归例子: 初始条件是第一个学生为10岁,后面每多一个学生+2岁
例子:用递归算阶乘
为什么num>=17就是越界了 是根据int这个类型的int类型通常占用 4 个字节(byte),即 32 位(bit)。它能表示的有符号整数范围是 -2,147,483,648 到 2,147,483,647。
当计算阶乘时,随着数字的增大,阶乘的结果会迅速增长。17 的阶乘是 355,687,428,096,000,已经超出了int类型所能表示的范围。所以当num >= 17时,计算结果很可能会超出int类型的表示范围,从而导致数据溢出,出现错误的结果或程序异常,因此将其视为越界。
这个是演示将数组名当作参数的例子
对于返回值类型的设计:函数的返回值类型应该和它的设计目的相契合。对于shuzhu函数,它的主要功能是打印数组里的元素,而不是要计算出一个特定的结果并返回给调用者。shuzhu 函数只是将组 array 中的元素 1、2、3 依次打印出来,并没有对数组进行求和、求平均值之类的计算来得到一个代表数组的数值结果并返回给调用者。所以在这个函数中,数组不是需要求的值,函数的设计目的也不是返回一个与数组相关的计算结果,而是专注于打印数组元素这一操作。
1.如果一个函数的主要目的只是执行一些操作,例如打印信息、修改全局变量或者数组的内容等,并不需要产生一个特定的结果返回给调用者时,就可以将函数的返回值类型定义为 void。像 shuzhu 函数,它的主要任务是遍历并打印数组元素,没有一个需要返回的具体值,因此返回值类型为 void。
2.如果一个函数的主要功能是进行某种计算并得到一个具体的结果,并且这个结果需要反馈给调用该函数的地方时,就可以使用 return 语句来返回相应类型的计算结果,同时函数的返回值类型也要设置为对应的类型。比如前面提到的计算两个数之和的函数 add 以及计算数组元素之和的函数 sumArray,它们都有具体的计算操作,并且将计算得到的结果通过 return 返回给调用者,所以函数的返回值类型设置为 int。
函数关于数组的一些坑和写法,也是上题的完善
形式参数中没有数组的概念,传递进去的是数组的首地址
数组首地址的内存大小是8字节 数组的一个地址是8字节
Tips:在 64 位系统中,通常计算机使用 8 字节来存储一个地址值,因此数组中每个元素的地址在内存中都占 8 字节。
需要注意的是,数组元素地址所占用的内存空间大小与数组元素本身的数据类型及所占用空间大小无关。例如,一个 int 类型的数组,虽然每个 int 型元素通常占用 4 字节的内存空间,但存储每个元素地址的空间都是 8 字节。
在 32 位系统中,存储地址的空间通常为 4 字节,所以数组中每个元素的地址在内存中占 4 字节。
一些很有意思的例子
实际上就是要理解 数组传递的是地址(是首地址),因此修改的是相同地址中的值,不是改地址,是改地址中的值,另外一个只是单纯的看作为对 值 的一个复制,是不同的地址
例题:现在有两个班一个班5人一个班10人算出平均分
以后对数组的操作大多数都是这样操作了(函数里面需要包含数组名,和数组长度len)
数组长度用sizeof(数组名)/sizeof(数组[0]);