嵌入式学习第二周

嵌入式学习第二周

Day01
1、在循环中使用break;语句,立刻结束循环的执行。只要执行了此语句,循环的一切语句不再执行,包括循环变量也不再变化。循环结束后循环变量一定落在指定数字范围内。
如果编写循环的时候不知道循环要重复执行的次数就可以编写一个死循环,在循环里使用break;语句结束它。(影响所有循环)
2、Continue;语句可以跳到循环的大括号末尾,中间的所有语句在这次循环中都不执行。(只影响某一次循环)
3、无法预先知道的数字叫随机数,rand标准函数可以用来获得随机数(必须包含头文件stdlib.h) 如 printf(“%d\n”,rand());
4、Srand标准函数用来设置随机数种子,这个函数需要一个整数作为种子(必须包含stdlib.h头文件) 如srand(种子数) 任何程序只需要执行一次srand标准函数就可以了
5、time标准函数可以获得当前时间并用一个整数表示它。同一秒之内得到的代表时间的整数是一样的(必须包含头文件time.h)
6、分支和循环都可以让程序里的语句不再从上到下顺序执行,具有这种特征的语句叫流程控制语句
7、goto语句也是流程控制语句,它可以吧任何一条语句指定成下一条语句
8、一个问题的解决过程中包含多组数字的变化过程,不同组数字的变化相互关联而且快慢不同。这种问题就可以采用多重循环的结构解决。(有多少个数字就有多少个循环)
外循环的循环变量负责代表变化慢的数字,内循环的循环变量负责代表变化快的数字
9、while关键字也可以用来编写循环(优先使用顺序:for 、while)
While(逻辑表达式){反复执行的语句}
循环首先执行逻辑表达式,当表达式为假时直接结束,所以有可能不执行大括号里面的内容。
While循环里面也可以使用break;和continue;语句(作用与在for循环中无区别)
10、do···while首先执行大括号里面的语句,所以至少执行一次大括号的语句
do {反复执行的语句} while(逻辑表达式);
11、用户在键盘上输入的内容首先进入输入缓冲区,scanf标准函数从输入缓冲区里获得数字并记录到存储区里。先进入数字缓冲区的数字必须先处理
12、如果程序无法处理用户某次输入的内容就永远无法处理用户以后输入的内容
13、可以使用两条固定语句把输入缓冲区里第一个‘\n’字符前的内容和‘\n’一起删除 scanf(“%*[^\n]”); scanf(“%*c”);
14、printf函数把要显示的内容放在输入缓冲器里,计算机在合适的时候吧输入缓冲区里的内容显示在屏幕上
15、在以下四种情况计算机才会把输出缓冲区里的内容显示在屏幕上
1)如果缓冲区里包含‘\n’字符则他前面的所有内容会显示在屏幕上
2)程序结束后就把它放在输出缓冲区里的内容显示在屏幕上
3)当缓冲区满的时候就把输入缓冲区的内容输出到屏幕上
4)程序里可以使用fflush(stdout)强制把输出缓冲区里的内容显示在屏幕上(scanf有同样功能)

Day02
1、数组可以代表内存里一组连续的同类型存储区,这些存储区叫做数组的元素。
2、数组需要先声明然后才能使用,声明的时候除了要提供类型名称和变量名称以外还需要提供一个整数用来表示数组里的存储区个数。 如 int arr[5];
3、数组一旦存在则里面的存储区个数不可以改变
4、数组通常不会作为整体使用,一般一次只使用其中的某个存储区
5、数组里的每个存储区有一个编号,这个编号叫做数组的下标。第一个下标是0,后面一次递增。下标范围是0到存储区格式减1,超过范围的不能使用
6、数组的初始化:可以提供多个初始化数据,每个初始化数据用来初始化一个存储区。
所有初始化数据写在一对大括号中间,相邻数据之间用,分开。对应的存储区对应下标从小到大
如果初始化数据多于存储区个数就忽略后面多余的初始化数据;存储区个数多于初始化数据,后面没有对应初始化数据的存储区自动被初始化为0;如果存储区个数和初始化数据个数一样多就可以忽略
7、数组名称不能代表任何存储区,可以代表第一个存储区的地址
8、可以对数组名称进行sizeof计算,结果是数组里所有存储区的总大小
9、C99规范字中允许使用变长数组,声明时用变量表示数组里的存储区个数
如果程序多次运行则每次运行时候变长数组的存储区个数都有可能不同,但是在某一次运行过程中变长数组里的存储区个数不能改变
变长数组不能初始化
10、不能表示存储区分组情况的数组叫一维数组,能表示的叫多维数组
11、声明二维数组的时候需要提供两个整数,前一个代表分组个数,后一个代表分组里的存储区个数
12、二维数组易班不会作为整体使用,一般一次只使用其中的某个存储区。为了表示二维数组的存储区,需要在名称后面提供两个下标,前一个表示分组编号,后一个代表存储区编号
组下标的有效范围从0开始到分组个数减1为止,组内下标的有效范围从0开始到分组里存储区个数减1为止
13、可以采用双重循环依次处理二维数组里的每个存储区
14、二维数组也应该进行初始化,可以采用一维数组初始化的方法初始化二维数组。可以对初始化数据进行分组,每组数据用来初始化一组存储区。
15、如果可以根据初始化数据个数确定分组个数就可以省略二维数组声明时的分组个数,其中后面一个不能省略
16、二维数组名称也可以代表数组里第一个存储区的地址,对二维数组名称进行sizeof计算得到的是二维数组所有存储区的总大小
17、使用二维数组的时候可以只提供一个下标,着下标当作组下标看待。这个写法表示下标对应组里第一个存储区的地址,也能动作一维数组使用,这个一维数组包含下标对应组里所有存储区

Day03
1、C语言里允许采用分组的方式管理程序里的语句
每个语句的分组叫做函数
2、多函数程序执行时的时间分配情况必须遵守以下规则:
1)整个程序的执行时间被分成几段,不同时间段被分配给不同的函数使用
2)所有时间段之间不能互相重叠并且必须连续
3)如果函数A把自己的时间分配给函数B 使用则函数B结束所有工作之后必须把后面的时间还给函数A
3、如果函数A吧自己的时间分配给函数B使用则它们之间存在函数调用关系
在这个关系里函数A叫做调用函数,函数B叫做被调用函数
只有在被调用函数存在期间,函数调用关系才存在
4、为了在两个函数之间产生函数调用关系需要在调用函数里编写函数调用语句
5、不可跨函数使用变量,不同函数的变量可以重名
6、如果函数可以多次运行则每次运行的时候函数里的变量对应的存储区都可能不同
7、可以在声明变量时使用volatile关键字,这种变量对应的存储区内容可以被其他程序修改
8、函数调用过程中通常伴随着两个函数之间的数据传递
数据传递存在两个完全相反的方向,既可以从调用函数传递给被调用函数也可以从被调用函数传递给调用函数
不论从哪个方向的数据传递都需要使用被调用函数提供的存储区
9、从被调用函数只能向调用函数传递一个数据,这个数据叫做被调用函数的返回值
10、只能在被调用函数结束的时候才能传递着数据,被调用函数需要吧用来巨鹿返回值的存储区的类型名称写在函数名称前
11、被调用函数里使用return关键字指定返回值的数值;调用函数里把函数调用语句直接当作数字使用就可以得到函数的返回值
12、如果被调用函数里没有使用return关键字指定返回值的数值则返回值是随机的;
调用函数只有一次获得返回值的机会,得到返回值以后或者立刻使用或者转存到其他存储区
如果函数不提供返回值,就应该在函数名称前写void
如果函数名称前什么都不写在C89规范里表示函数提供一个整数类型的存储区用来存放返回值,在C99规范里不允许这样
13、函数不可以使用数组存放返回值

Day04
1、可以从调用函数向被调用函数传递多个数据,这些数据的类型可以不同
2、被调用函数需要为每个传递过来的数据提供一个对应的存储区;
在函数名称后的小括号里声明一组变量,这组变量用来代表失眠提到的存储区
这些变量叫做函数的形式参数,小括号里的所有内容叫做函数的形式参数列表
每个形式参数的理想名称都不能省略(即使类型名称一样),相邻两个形式参数声明之间用逗号隔开
3、被调用函数可以把形式参数当作变量使用
4、函数调用语句的小括号里需要为每个形式参数提供一个对应数字,计算机把这些数字记录到对应的形式参数里。被调用函数可以通过形式参数得到这些数字
这些数字叫做实际参数,只要能当作数字使用的内容都可以作为实际参数使用
5、函数可以不提供形式参数,这个时候函数的小括号应该写void
如果函数小括号里无内容表示函数可以提供任意多个不确定类型的形式参数
6、数组可以作为函数的形式参数使用,此时真正的形式参数并不是数组,而是一个可以当作数组使用的变量
数组形式参数里包含的所有存储区都不是被调用函数提供的,在调用之前已存在
声明数组形式参数的时候可以省略数组里面的存储区个数
7、使用数组作为形式参数的时候需要另一个提供整数类型的形式参数表示数组里可以使用的存储区个数
通过数组形式参数可以让被调用函数使用其他函数分配的存储区
数组形式参数可以实现双向数据传递,这种参数叫做输入输出参数
8、C语言里函数的个数可以不固定,这种参数叫做变长参数。不能在编写函数的时候给变长参数命名,被调用函数里需要使用一些特殊的方法才能获得未命名参数的内容
9、如果编译器首先遇到函数调用语句就会猜测函数格式。计算机一般认为函数有一个整数类型的存储区用来存放返回值,同时有任意多个不确定类型的形式参数
这个猜测的结果叫做函数的隐式声明,隐式声明里函数参数的类型只能是整数类型或双精度浮点类型
如果函数的真实格式和隐式声明的格式不同,编译器就会报错
10、函数大括号前面的部分可以单独写成一条语句,这种语句叫做函数声明语句
函数声明语句中可以省略形式参数的名称。把函数声明语句单独写在文件开头叫函数的显式声明,可以避免隐式声明
除了主函数以外的所有函数都需要显式声明
11、exit标准函数可以立刻结束程序的执行,为了使用这个标准函数需要包含stdlib.h头文件
这个函数需要一个整数类型的参数,这个参数的作用和主函数返回值的作用一样。如exit(0)
12、C语言函数可以调用自己,这种函数叫做递归函数
如果一个问题可以分解成多个小问题,其中至少一个小问题和原来的问题本质上一样。这种问题就适合采用递归函数解决
13、递归函数编写步骤
1)编写语句解决分解后的每个小问题(此时假设递归函数已经编写完成,可以使用了)
2)在函数的开头编写分支负责处理不可分解的情况,这个分支必须保证函数可以结束(以return作为分支结尾)
14、采用递归函数解决问题的思路叫做递归,采用循环解决问题的思路叫递推
15、在验证或理解递归函数的时候可以采用最简单的参数进行测试,然后逐渐用更复杂的参数进行测试。在这个过程中就可以验证递归函数是否编写正确及理解递归函数的功能

Day05
1、变量只能被程序里的某一组语句使用,这组语句叫做变量的作用域
2、声明在函数里面的变量叫局部变量,这种变量的作用域是函数里面的所有语句;声明在所有函数外边的变量叫全局变量,这种变量的作用域是程序里面的所有语句
3、没有初始化的全局变量自动初始化为0。全局变量和局部变量可以重名,这个变量名称优先代表局部变量
4、如果编写程序的时候局部变量和全局变量都能解决问题,应该优先选择局部变量
5、存储区的使用不受作用域限制(可以跨函数使用存储区),存储区的使用受到声明周期的限制
6、生命周期是一段时间,在生命周期开始的时候,计算机吧存储区分配给程序,在生命周期结束的时候计算机把存储区收回
7、全局变量的生命周期是整个程序的执行时间,局部变量的生命周期是函数某一次的执行时间。函数开始的时候计算机为局部变量分配存储区,函数结束得很好计算机把局部变量的存储区收回。
8、如果函数多次运行则每次运行的时候局部变量对应的存储区都可能不同
9、静态变量的生命周期和作用域跟普通变量不一样。声明静态变量时需要使用static关键字,不论全局变量还是局部变量都可以声明成静态的
10、静态局部变量的生命周期是整个程序的执行时间,没有初始化的静态变量真的初始化为0
11、程序执行期间静态局部变量的存储区随时可以使用,静态局部变量的作用域和普通局部变量的作用域一样,静态局部变量初始化只在程序开始时执行一次
12、静态全局变量的生命周期还是整个程序的执行时间,它的作用域只包含声明它的文件里的所有语句(不可跨文件使用静态全局变量)
13、变量的作用域分为三种:局部变量,静态全局变量和非静态全局变量
14、变量的生命周期分为两种:非静态局部变量和其他
15、指针变量只能用来记录地址数据
16、指针变量的用途:找另外一个普通变量(只有记录有效地址的指针变量才能使用) 声明指针变量的时候需要在变量名称前加*
如果一个指针记录了一个变量(存储区)的地址,就可以认为它们之间建立了捆绑关系
当一个指针和一个普通变量之间存在捆绑关系的时候,就可以通过指针变量前加*的方法,通过指针表示那个存储区
17、声明指针变量的时候也需要提供类型名称,它代表这个指针适合与什么类型的普通存储区捆绑
18、可以在一条语句里声明多个同类型的指针变量,这个时候要在每个指针变量名称前单独加*
19、没有记录有效地址的指针分为两类:
1)空指针固定记录空地址(null),这个地址的数值就是0
2)所有其他无效指针都叫野指针
20、程序里禁止出现野指针,程序里的指针变量必须初始化
21、指针初始化的时候*没有参与赋值过程,被赋值的是指针本身

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值