函数的定义
-
什么是函数
函数:一段封装的代码 实现了某一个功能
函数的定义
返回值类型 函数名(参数类型 参数){
函数体;
return 返回值;
}
#include<stdio.h>
int Add(int a, int b); //函数声明 推荐这种先声明后定义的方法
int main()
{
printf("a+b:%d",Add(5,2));
return 0;
}
int Add(int a, int b) //函数的定义
{
return a+b;
}
返回值
函数定义的时候申明函数返回值类型 函数结束前返回一个值
-
注意事项
-
函数声明中可以只写 参数类型 不写 形参名字 (但是定义不行)
-
函数参数名如果有 要和定义保持一致(不一致可能会出现问题)
-
void 类型函数可以没有返回值
函数的调用
普通调用
调用方式:函数名(参数)
Add(5,3); //直接调用函数
-
函数声明
在定义的函数的时候,如果在函数定义前调用,需要在调用的前面加上一个函数声明 告知这个函数存在
//main函数前声明函数
int Add(int a, int b);//函数声明
推荐先定义后实现,这样能够人让阅读代码的时候首先看到最重要的主函数main()函数
嵌套调用
-
函数作为函数体嵌套调用
#include<stdio.h>
int Add(int a,int b) //函数定义后直接实现这个函数的功能
{
return a+b;
}
void Print()
{
int temp=Add(2,3); //一个函数里面调用另一个函数
printf("%d\n",temp);
}
int main()
{
Print(); //函数的嵌套调用
return 0;
}
-
函数作为实参的嵌套调用
#include<stdio.h>
int Add(int a,int b) //函数定义及实现
{
return a+b;
}
int main()
{
printf("%d\n",Add(2,Add(1,2))); //函数的嵌套调用
return 0;
}
形参和实参
形式参数
定义或者声明时的参数为形式参数,简称形参
int Add(int a, int b);//函数声明 这里的a,b就是形参
实际参数
函数被调用时的参数为实际参数,简称实参
Add(5,3);//直接调用函数 这里的5,3就是实参
函数传参
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有两种向函数传递参数的方式:
传值调用
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
#include<stdio.h>
int Add(int a,int b); //函数声明
int main()
{
int a=2,b=3;
printf("%d\n",Add(a,b)); //函数调用
printf("%d,%d\n",a,b);
return 0;
}
int Add(int a,int b)
{
a=5,b=6; //修改函数内的形式参数
printf("%d,%d\n",a,b);
return a+b;
}
引用调用
通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
指针的时候再详细说明,
数组传参
-
一维数组传参
函数定义的时候只要数组名+[],不用加数组大小,如果需要数组大小的话另起变量。
void sort(int arr[],int size);
调用的时候直接传数组名
int arr[10]={0};
sort(arr,10);
-
二维数组传参
形参省略行 列不能省略
void sort(int arr[][10],int row);
调用的时候直接传数组名(数组的列必须与函数定义的列相同)
int arr[2][10]={0};
sort(arr,10);
作用域
-
变量的生存周期
不同作用域变量生命周期不一样 不同作用域变量不重名
#include<stdio.h>
int i=5; //全局变量 函数外面定义的变量
int main()
{
int i=0, j; //局部变量 函数里面定义的变量(包括main函数)
printf("%d\t", i);
{
int i=1; //局部变量
printf("%d\t", i);
}
printf("%d\n",i);
return 0;
}
打印结果:
0 1 0
Press any key to continue
上面的示例代码定义了多个i变量,但是他们并不冲突,需要注意的是
全局变量和局部变量名字一样 遵循就近原则
-
局部变量:
在{}里面定义的变量 出了{}就不能使用 {}这个就是变量的作用域
-
全局变量
在函数外部定义的变量 定义之后在后面都能使用
static 静态变量
修饰一个静态变量 只会初始化一次
static int x; //用static 修饰的变量 只会初始化一次
#include<stdio.h>
void fun()
{
static int x=1; //声明静态变量
printf("%d\n",x++);
}
void fun1()
{
int x=1; //普通变量
printf("%d\n",x++);
}
int main()
{
printf("****static****\n");
fun();
fun();
printf("****普通****\n");
fun1();
fun1();
return 0;
}
输出:
****static****
1
2
****普通****
1
1
Press any key to continue
递归调用
递归调用:函数直接或者间接在函数内调用自身
求解斐波那契数列第n项值 (简单版)
#include<stdio.h>int Fibo(int n){ //存在唯一条件 if(n==1||n==2) return 1;