函数
函数:一段封装的代码 实现了某一个功能
返回值类型 函数名(参数类型 参数){ 函数体; 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;
}
函数定义的时候申明函数返回值类型 函数结束前返回一个值
调用方式:函数名(参数)
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 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; //尊在推导公式 return Fibo(n-1)+Fibo(n-2);}int main(){ int n; printf("input Fibo n:"); scanf("%d",&n); printf("rusult:%d\n",Fibo(n)); return 0;}
接下来用函数模块化的方式做一个关机系统,滑动关机,你不知道的关机方式。