1 函数的定义和声明:
1.1 定义的基本格式:
返回值类型 函数名(函数参数1,函数参数2,……) //函数头部(参数根据需要添加)
{
函数体; //函数的功能
return; //函数的返回语句(返回值)
}
1.2 声明的基本格式:
- 作用:告诉编译器有这个函数
- 使用函数头部进行函数声名, 例:
- 返回值类型 函数名(函数参数1,函数参数2,……); //在函数使用之前必须要有函数的定义或者函数的声名
2 函数的种类:
2.1 自定义函数:自己编写的功能函数
2.2 库函数:已经定义好的,一般是包含头文件就能用,例:
#include<stdio.h>
#include<math.h> //包含数学库函数
int main()
{
printf("数字100的算术平方根为:%d",sqrt(100)); //直接调用数学库函数中的求平方根函数sqrt(int x),其他码农友们自行尝试
return 0;
}
2.3 主函数:
int main() //C语言的开始 { .... return 0; }
3 函数的调用:
3.1 基本格式:函数名(参数列表)
3.2 调用输出返回值问题:
函数的返回值:函数通过return语句返回函数运行后的结果
函数的类型决定着函数返回值的类型
函数的返回值需要和函数类型相同,或者是赋值兼容
返回值返回到哪里去?在哪里调用的这个函数就返回到哪里
函数执行完毕之后,返回值返回的结果用于代替函数调用语句,例:
#include<stdio.h> float SUM(float x,float y) //求两个数的和 { return x + y; //返回两个数的和 } int main() { printf(“%f\n”,SUM(3.2f,3.2f));//函数调用输出 return 0; }
3.3 函数的参数及其传递:
- 主调函数:调用其他函数的函数
- 被调函数:被其他函数调用的函数
- 内容:
- 在一次函数调用中,如果有参数,那么主调函数和被调函数之间就存在参数传递
- 函数参数传递时参数的类型:一般分为两种类型,实参和形参
- 主调函数中用于给被调函数传递数据的参数称为实际参数(实参)
- 被调函数中用于接收主调函数所传递过来的数据的参数称为形式参数(形参)
- 例:
#include<stdio.h> float SUM(float x,float y) //求两个数的和(x和y是形参) { //实参值传递给形参相当于实参给形参赋值:x = a, y = b int n, m; //在哪个{}大括号里定义的变量,就只能在哪个{}大括号里使用 return x + y; //返回两个数的和 } int main() { int a,b; SUM(a,b);//a和b是实参 }
3.4 函数传递的注意事项和易错理解:
- return; //可以通过函数返回语句强制结束函数的执行;函数执行了return返回语句之后就不再执行本函数之后的语句;
- 尽管名字相同,但是实参和形参是两个不同的变量,在普通的参数传递类型下互不影响
- 函数形参只有在函数调用了之后才会被定义,定义之后才占内存空间,不调用不占用,函数执行完毕之后内存会被释放,也不会再占用内存
- 数组作为函数参数传递:实参是什么类型的,形参就定义成什么类型,例:
#include<stdio.h> void arrscanf(int arr[ ],int n) //定义整型数组的输入函数 { //数组名作为函数参数传递,形参数组可以改变实参数组中数组元素的值 //数组名为数组的首地址,数组名作为函数参数传递时,参数的传递类型为地址传递 for (int i = 0; i < n; i++) { scanf("%d", &arr[i]); } } int main() { int arr[10]; arrscanf(arr, 10); return 0; } //注: //数组名作为函数参数传递,形参数组可以改变实参数组中数组元素的值 //数组名为数组的首地址,数组名作为函数参数传递时,参数的传递类型为地址传递
4 函数进阶:
4.1 函数的嵌套调用:
4.1.1 含义:
在一个函数的执行过程中调用另一个函数,注:函数能够嵌套调用,但是不能嵌套嵌套定义也就是在一个函数的函数体中不能再定义其他函数,函数的定义是独立的
4.1.2 调用方式,例:
#include<stdio.h>
//例:如何求三个数中的最大值?
//方法:先求出两个数中的最大值,再和第三个数比较(用嵌套函数的方法实现)
//求出两个数中的最大值的函数
int MAX_2(int x, int y) // 求两个数中的最大值
{
return x > y ? x : y;
}
//嵌套调用函数MAX_2求出三个数中的最大值
int MAX_3(int x, int y, int z) //求三个数中的最大值
{
return MAX_2(MAX_2(x, y), z);//函数MAX_2嵌套调用
}
int main()
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
printf("三个数中的最大值为:%d", MAX_3(a, b, c));
return 0;
}
4.2 函数的递归调用:
4.2.1 含义:
在一个函数的函数体中,直接或间接的调用自己本身
4.2.2 特点:
可以使用递归完成循环的效果
4.2.3 调用方式,例:
#include<stdio.h>
//求1到n的和
//方法:(递归)
int SUM(int n) //递归求1到n的和
{
if (n <= 1) return 1;
return n + SUM(n - 1); //递归
}
int main()
{
printf("1到100的和为:%d",SUM(100));
return 0;
}