一.什么是函数
定义:完成一定功能的代码,将代码打包封装起来,成为工具
二.函数的定义
定义函数基本格式:数据类型 函数名(参数列表)
1)定义无参无返回值函数
1. void fun() 2. { 3. printf(“--------------------------------------------------\n”); 4. }//这里定义了一个函数,函数名为fun,无返回值,完成打印分隔线的功能。
2)定义有参数无返回值函数
1. void max(int x,int y) 2. { 3. int z; 4. z=x>y?x:y; 5. printf(“%d\n”,,z); 6. } 7. //求最大值函数,输出两个数之间的最大值
3)定义有参数有返回值函数
int max(int x,int y) { int z; z=x>y?x:y; return z; }//求最大值函数,返回两个数之间的最大值
4)定义无参数有返回值函数
int SCANF() //输入函数 { int temp; printf("请输入一个整型数据:\n"); scanf("%d",&temp); return temp; }
三、函数的调用
1、函数调用语句
函数调用的基本格式:函数名(实参列表);
int a=10,b=20,c; c=max(a,b); //函数调用语句,调用max函数求a和b两个数中的最大值赋值给c
四、函数的声明
把函数的定义放在最后,主函数里能够调用么?
在一个函数中调用另一个函数(即被调函数)需要具备以下条件:
1)首先被调用函数必须是已经定义好的函数(库函数或自定义的函数)。2)如果使用库函数,应该在本文件开头用#include指令将调用相关库函数时所需用到的信息“包含”
到本文件中来。如:#include<stdio.h>。
3)如果使用用户自定义的函数,在调用函数之前必须要有被调函数相关的声明语句,也就是函数需要先声明后使用。
函数声明语句的一般格式:
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,……,参数类型n 参数名n);
五、局部变量和全局变量
按照变量作用域的不同,我们将变量分为局部变量和全局变量。
1、局部变量
局部变量的作用范围只在一定范围内有效
局部变量的定义可能有以下几种情况:
1)在函数开头定义;
2)在函数内部的复合语句中定义;
2、全局变量
全局变量的作用范围相对于局部变量来说更为广泛,其在函数外部定义,也称为外部变量
3、静态变量与动态变量
程序中所定义的变量默认是动态变量(auto)。
在定义变量前加一个static可定义一个静态变量。
静态变量在程序开始后定义,结束前才会被释放,所以其生命周期比较长,在函数调用中只会被定义一次,不会被定义多次,当再次执行到定义语句时,其值不会被重置(初始化),会保留上次改变的值。
六、函数的嵌套调用
函数的定义时相互平行、独立的,在定义函数时,一个函数内不能再定义另一个函数,也就是说,函数不能嵌套定义。但是函数可以嵌套调用,也就是再调用一个函数的过程中,又调用另一个函数。
七、函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用此函数本身,称为函数的递归调用。
递归调用演示示例:
//递归求1~n的和 int function(int n) { if(0>=n)return n; //结束递归的条件 return n+function(n-1); //这里在函数中调用此函数本身,实现递归 }
八、数组作为函数参数传递
数组名为数组的首地址,所以整个数组作为函数参数传递实际上是引用传递,传递的是地址,形参的改变会影响到实参。
如:字符串的输出
1. void PUTS(char str[]) 2. { 3. puts(str); 4. } 5. main 6. { 7. char S[20]="hello world!"; 8. PUTS(S); 9. }
注意:在函数中改变形参数组元素的值,那实参数组元素的值是否会被改变呢?
(涉及到指针的相关概念)