四、参数
-
理解:在很多情况下,函数和调用者之间需要数据交互,调用者需要给函数传递一些数据,交互
的数据称为参数
-
形式参数
(1) 形式参数:简称为形参,在函数定义时,约定调用者需要传递的数据类型及参数名 (2) 语法:返回值类型 函数名(数据类型 参数名1,数据类型 参数名2,数据类型 参数名3){} (3) 使用:形参相当于函数内部的变量,在函数中直接通过参数名进行使用,但是不能出现命名冲突
-
实际参数
(1) 实际参数:函数在调用时,给形参传递的数据,简称为实参 (2) 实参作用:实参给形参赋值,实参的数据类型、个数、顺序和形参一致 (3) 函数调用:函数名(实参1,实参2,实参3);
#include<stdio.h> void main(){ printf("好好学习....\n"); printLine(20,'='); printf("天天向上....\n"); printLine(30,'+'); printf("good good study....\n"); printLine(40,'*'); printf("day day up...."); } void printLine(int a,char s){ int n; for(n=1;n<=a;n++){ printf("%c",s); } printf("\n"); }
五、返回值
-
理解:函数和调用者之间的一种数据交互,通过调用函数获取的数据结果(函数 给 调用者数
据结果)
-
函数返回值的语法:
返回值类型 函数名(形参列表){ // 函数体、函数的实现 }
-
函数返回值的分类:
(1) 返回值类型为 void,代表当前函数不需要返回值任何结果: void 函数名(形参列表){}
(2) 返回值类型 为 具体的某种数据类型,代表函数需要返回结果: 数据类型 函数名(形参列表){ // 函数体 return xxx; } 注意:函数的返回值约定了函数和调用者之间交互的数据类型
-
return的作用:
(1) 将函数的结果返回值给调用者 (2) 结束当前函数
案例: int add(int a,int b){ return a+b; // 返回值当前值,同时后面不能再定义其他内容 }
-
函数返回值的处理方式:
(1) 第一种处理方式:函数的返回值可以不处理 #include<stdio.h> void main(){ add(6,9);//函数的调用,函数程序运行,返回值结果不予处理 } // 函数 int add(int a,int b){ return a+b; }
(2) 第二种处理方式:定义同类型的变量进行存储返回值 #include<stdio.h> void main(){ int r=add(6,9); printf("%d",r); } int add(int a,int b){ return a+b; }
(3) 第三种处理方式:直接在使用的位置,调用函数 #include<stdio.h> void main(){ printf("%d",add(6,19)); } int add(int a,int b){ return a+b; }
六、函数的嵌套调用与递归调用
-
函数的嵌套调用:一个被调用的函数,在它执行未结束之前又调用其他函数,这种调用关系可以嵌套多层,理论上嵌套层数不受限制。
#include<stdio.h> void main(){ printf("%d",add(6,19)); } int add(int a,int b){ return a+ select(b); } int select(int r){ if(r%2==0) return r/2; else return (r-1)/2; }
-
函数的递归调用
(1) 理解:一个函数在执行过程中调用自身 (2) 注意:如果使用递归应用,必须注意设置递归调用出口,否则可能出现无穷递归
(3) 递归思想 a.递进:每一次推进,计算都比上一次变得简单,直至简单到无需继续推进,就能获得结果。也叫到达出口。 b.回归:基于出口的结果,逐层向上回归,依次计算每一层的结果,直至回归到最顶层。
案例: #include<stdio.h> void main(){ printf("%d",jieCheng(6)); } int jieCheng(int n){ if(n==1 || n==0) return 1; return n*jieCheng(n-1); }