第五章函数
5.1函数的定义
牢记函数定义三要素
- 函数名(必须体现函数功能)
- 参数列表y=x+1
- 返回值y(函数调用时就是调用返回值,返回值既可以是表达式也可以是参数)return y;或者return x+1;
5.2无参函数的定义和调用
5.3有参函数的定义和调用
①一个返回值,两个个参数
②一个返回值,三个参数
5.4函数一些的用法
①定义空函数,在函数设计中是为了占坑使用的
②函数可以用作表达式,调用的是函数返回值
比如:h=add(x,y,z)
- 函数还可以用作其他函数调用的参数,也是运用的返回值
比如:printf(“h=%d”,add(x,y,z));
5.5函数形参与实参的区别
在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,在发生函数调用时,函数add的形参才被临时分配内存单元。
实参与形参的名字可以相同也可以不相同,两者的值相同,实参对应的值传递给形参。
通过return语句将函数值带回主调函数,应当注意返回值的类型与函数类型一致,如add函数为int型,返回值是变量
编程案例:输入两个整数,要求输出两者中的较大值,用函数实现
这个案例中运用了三目运算符(条件运算符)
它的格式为: 表达式1?表达式2:表达式3
先求解表达式1,
若其值为真(非0)则将表达式2的值作为整个表达式的取值,
否则(表达式1的值为0)将表达式3的值作为整个表达式的取值。
例如:
1、max=(a>b)?a:b
就是将a和b二者中较大的一个赋给max。
2、min=(a<b)?a:b
就是将a和b二者中较小的一个赋给min。
5.6函数的嵌套
编程案例,输入四个数a,b,c,d,函数的方式输出最大值
注意:在函数嵌套时,getfromtwo要先在getfromfour前面定义好,不然编译的时候会报警。
5.7函数的递归
函数的递归等于函数自己嵌套自己,直接上案例分析
求:用函数递归求n阶乘?
这个案例对于大于16的数,运用了exit函数,
Exit是C语言中的一个终止函数。 它位于库函数<stdlib.h>中。
在C语言的main函数中我们通常使用return (0);这样的方式返回一个值。但这是限定在非void情况下的,也就是非void main()这样的形式。
exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。
exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出。在整个程序中,只要调用 exit ,就结束。
但在如果把exit用在main内的时候,无论main是否定义成void返回的值都是有效的,并且exit不需要考虑类型,exit⑴等价于return ⑴。
5.8数组作为函数的参数
数组作为函数的参数传递时,它传递的是数组的首地址,而不是数组本身包含的数值。传递时是将数组的首地址传给相应的参数,接受数组的参数要么一个数组,要么是指针类型的变量。
举例说明:
输出结果为:
下面引用一个博主对数组作为函数参数调用时的解释
在函数需要将数组作为参数传入时,数组是传址调用,即将数组作为实参时,传入的其实是数组的首地址,实质上是一个指针。
在定义函数时可以定义一个指针,然后去调用数组,此时在函数内部的操作会直接修改数组的实际对应元素。因为传输进函数的数组的本质就是数组的首元素地址,函数内部按照地址去修改当然相当于直接操作数组。
在需要一个函数返回数据时也可以用定义指针,然后传入数组,将需要传回的数据放进数组内,在函数结束调用后,去相应的数组内取回数据。
但是需要注意的是,数组传入函数时只有当传入的是一个数组名时才是传址调用,如果给定下标的话就是一个标量,
例如定义一个数组int num[20]。当传入num[0]、num[1]或其他下标时,传入的就是一个标量,而非一个传址调用了,此时如果有需要依然传入地址,
例如想将数据放入数组,但是想从第二个元素位开始,就需要加一个取址符 “&” ,即&num[2],此时会将num[2]的地址传入,在写入数据时,也会从num[2],开始。
注意:
如果定义一个数组,元素只有一个下标,即类似于int num_ine[1],此时直接传入函数,也是标量传入,而非传址调用。
在需要将数组传入函数,但是不想数组被改变时,可以使用const 关键字修饰,即函数形参定义为int const num[],此时数组num会被声明为常量,即不可改变。
原文链接:数组做函数参数时的使用_一叶知秋@qqy的博客-CSDN博客_数组作为参数传入函数的到底是什么
一维数组作为函数参数,实操案例
有两个班的学生,分别是10个人和5个人,分别求这两个班学生的平均分
注意:数组在形参中的书写方式,带类型符,带中括号,但中括号内可以不用限制范围,因为在形参中,一维数组传递地址,不需要限制范围
5.9二维数组作为函数参数
二维数组作为实参时,要定义限制列数的范围。
例如,在实参中定义数组int a[8][10],
则在形参中的正确定义是int a[][10]或者int a[8][10]
实操案例:
有一个3x4的矩阵,初始化并输出,然后求最大值。
5.10全局变量
对于全局变量的定义,如下图所示
全局变量的定义比较简单,直接上练习题
班上有10个同学,封装一个函数,调用函数获得班级的最高分,最低分,平均分