一、知识点梳理
1.零碎知识点整理
- 设计一个函数步骤
(1)想函数什么返回值 无 void
(2)函数名的设计 见名知意
(3)函数参数的设计(参数类型,个数等) - 实参,形参
(1)实参与形参必须个数相同,最好类型也相同,如果类型不同,会发生隐式转换 实参——>形参
(2)按值传递 实参—(内存拷贝)—>形参 不同地址
按地址传递 指向同一地址 - 被调函数在主调函数之下会警告
- 实参求值从右向左
- 函数不能嵌套定义,但可以嵌套调用
- 全局变量:在函数外声明(能少用就少用)
未初始化时值为0
作用域:从定义开始到文件尾
生命周期:从程序开始到结束 - 局部变量:在函数内部声明的变量
作用域:函数开始到结束
生命周期:从函数指定定义语句开始到函数结束,函数结束会自动回收 - 不同作用域范围内可以声明同名变量
- 静态变量 static
(1)static 局部变量
作用域:从函数开始到结束
生命周期:从程序开始到结束,且函数结束不会回收内存
(2) static 全局变量
static int b; 表示静态全局变量,隐藏,这个全局变量或函数不能被extern - extern 外部声明,引用其他源文件函数或全局变量
- 头文件中不允许出现定义变量
- 同一个项目里不同c文件下不允许出现相同的全局变量
2.今日代码
- 正序打印正整数
void print(int n)
{
if (n <= 0)
{
return;
}
print(n / 10);
printf("%d\n", n % 10);
}
- 逆序打印正整数
void print(int n)
{
if (n <= 0)
{
return;
}
printf("%d\n", n % 10);
print(n / 10);
}
- 汉诺塔
void hannuota(char a, char b, char c, int n)
{
if (n == 1)
{
tt++;
printf("[%d]%c---->%c\n", tt, a, c);
return;
}
else
{
hannuota(a, c, b, n-1);
hannuota(a, b, c, 1);
hannuota(b, a, c, n-1);
}
}
3.今日练习
- 在C语言中,当函数调用时 实参和形参各占一个独立的存储单元
- 以下函数调用语句中实参的个数为 3 分别为v2,v5,v6
exce((v1,v2),(v3,v4,v5),v6); - 如果在一个函数的复合语句中定义了一个变量,则该变量 只在该符合语句中有效,在该符合语句外无效
- C语言规定,函数返回值的类型是由 在定义该函数时所指定的函数类型决定
#include<stdio_h>
void sub(int s[],int y)
{ static int t=3;
y=s[t];t--;
}
main()
{ int a[]={1,2,3,4},i,x=0;
for(i=0;i<4;i++){
sub(a,x);printf("%d",x);}
printf("\n");
}
输出为:
0000
main()
{ int w=5;fun(w);printf("\n");}
fun(int k)
{ if(k>O) fun(k-1);
printf(" %d",k);
}
输出为:
0 1 2 3 4 5
- 当调用函数时,实参是一个数组名,则向函数传送的是 数组的首地址
fun(float x)
{ float y;
y=3*x-4;
return y;
}
输出类型为 int
4.个人感悟
今天一天下来,收获颇多,但还是很累的,感觉自己有点跟不上同学。老师让课堂上编程的时候有些题目就想很长时间也想不出来,就比如中午下课前分钟老师让写题,有些同学下课前就写完了,但我一直到一点才调试出来。下午下课前做题,有时候我还没想出来,同学们就啪啪啪把答案敲出来了。有差距才有动力,希望接下来能继续加油,有所得吧。