六、函数
1. 函数基本概念
函数:理解为封装功能的容器。
函数的定义的基本格式:
//返回值类型 函数名(形参列表) //{函数体} int One(int a,int b)//a,b是形参 { return a+b; } int main() { printf(One(1,2));//1,2是实参 return 0; }
注:
- 返回值类型:常用的基本数据类型,函数执行完了之后,函数得到一个什么类型的值。通过 return返回,写在函数最末尾。如果不需要返回一个值,则返回值类型就用 void.
- 调用函数时,会把实参传给形参,对应位置进行传参。
2. 局部变量&全局变量
局部变量:作用域在一定的域内才能被使用的变量,出了自己的祖宗用于就会被释放掉。
全局变量:定义开始往下,所以的地方都可以使用,子啊程序结束的时候被释放。如果没有给全局变量进行赋值,系统默认赋值为0.
注意:全局变量和局部变量可以同名,就近原则使用。
静态变量:在程序执行后定义,生命周期是程序结束后才死亡,且只会被定义1次。
int main() { int q; for(int i=0;i<10;i++) { static int a=10;//在for前后无所谓 a++; printf("%d\n",a); //11 12 13 14 15 16 17 18 19 20 } return 0; }
注:q:在栈区,系统自动申请内存,程序结束之后自动释放内存。
a:在静态全局区,第一次循环,a=11,第二次执行到static int a=10;时,申请内存失败,继续执行a++,一直到循环结束。
3. 函数嵌套
址传递
在定义变量、数组、函数等,系统会分配内存区域(地址),把数据放到这个地址上。
一些概念
&:取地址符号,&a得到a的地址编号。
***:**定义指针变量的标志。可以存地址。int *d = &a
***:**第二个作用,解引用,取内容。
指针变量:存储地址的变量
整型变量:存储整数的变量
需要搞明白
(1)怎么定义一个变量存储地址—>指针变量
(2)怎么获取一个变量的地址&
(3)怎么通过指针变量访问指针变量上所保存的地址内部的数据
址传递能够通过形参改变实参的值
void fun(int *p1) { printf("%d\n",*p1); *p1 = 1000; //改变值,通过形参改变形参的值 } int main() { int a = 10; fun(&a); //输出10 printf("%d\n",a); //1000 }
函数的递归
void fun() { static int i = 10;//如果是int i=10,将报错,无法递归 if (i != 0) { i--; fun(); } printf("%d\n",i); } int main() { fun(); //输出11个0,这是递归的真正含义,当i=0,才printf 0,之前所有的没执行的printf,经过递归,全部输出。可以在此处打断点调试一下 return 0; }
实例1:倒序输出
void fun(int n) { if (n != 0) { printf("%d\n",n%10); fun(n/10); } } int main() { fun(1234); //4321 return 0; }
实例2:斐波那契数列 1 1 2 3 5 8 13 21…
int fun(int n) { if (n==1||n==2) return 1; else return fun(n-1)+fun(n-2); } int main() { printf("%d\n",fun(10)); //注意不能太大,会超出int范围 return 0; }
实例3:猴子吃桃:第一天摘下若干桃子,当即吃了一半,不过瘾,又多吃了一个,第二天又将剩下的吃掉了一半,且多吃了一个,以后每天如此,到第10天的时候,发现只剩下一个桃子,问第一天的时候总共摘了多少个桃子。用递归的方式???(作业)