本人是一名即将大四的在校大学生,由于深感自己的能力不足,所以在假期期间报名了华清远见的嵌入式培训课程,到现在为止,从我开始学习已经过去了半个多月了,现在我就来总结一下我的学习经历和学习成果吧。
再来华清远见之前之前,由于我的专业缘故也简单的学习过嵌入式系统,但也仅限于了解,就连嵌入式最基础的C语言,最简单的程序也不一定能完整地写出来。经过在华清远见这半个多月的学习,我已经基本掌握了c语言的基础知识内容。
首先是虚拟机和linux操作系统。
这套系统是我们学习嵌入式非常关键的东西,它可以虚构出一套类似于常规电脑最基础运行环境的模拟环境,我们就可以通过它来模拟出我们的程序在该环境下的运行状况。之后,我们正式开始C语言基础的学习。
一、32个基础的关键字:
数据类型:char、short、int、long、float、double、struct、union、enum、void
控制语句:if、else、while、do、switch、case、default、break、continue、for、goto
存储类型:auto、static、extern、register
const:只读
return:返回函数
Signed:有符号数
Unsigned:无符号数
Sizeof:计算所占内存空间的大小:单位:字节 sizeof(数据类型) // sizeof(变量名)
typedef:给已有的数据类型起别名
Volatile:防止编译器优化
这些关键字是我们在c语言编程中最常用的代码。
二、最基础的数据类型:
字符型:Char:(1字节 == 8bit)
整型:Int (4字节 == 32bit)
浮点型:float(单精度浮点数):%f-------默认小数点后6位
4字节,保证6~7位的有效数据;
Double(双精度浮点数):%lf------默认小数点后6位
8字节,有效数字的位数一般位:15~16位
类型转换
强制类型转换:方法:(强制转换的类型)变量
隐式类型转换:
横向箭头:不管有没有进行混合运算,都会进行转化
char、short当作int类型去用,float类型当做double去用
纵向箭头:只有进行混合运算,才会进行转换
三、运算符
算术运算符:+ - * / ++ -- %
关系运算符:> < == != >= <=
关系运算符是用来判断两者之间的关系的---------关系成立:1 不成立:0
逻辑运算符:&& || !
&&:
表达式1 && 表达式2
&&截断法则:有一个为假,结果就为假。前一个为假,后面就不在进行运算了
||:
表达式1||表达式2
||截断法则:有一个为真,结果就为真,前一个为真,后面就不在进行运算了
Sizeof运算符:Sizeof(数据类型) sizeof(变量名)
三目运算符:表达式1 ? 表达式2 :表达式3
先判断表达式1是否为真,如果为真,就将表达式2的值作为整个表达式的值,否则,将表达式3的值作为整个表达式的值
逗号运算符:从左至右依次计算,将最后一个表达式的值作为整个表达式的值
位移运算符:<< , >>
左移:
无符号数:高位丢弃,低位补0
有符号数:符号位不变,高位丢弃,低位补0
右移:
无符号数:低位丢弃,高位补0
有符号数:符号位不变,低位丢弃,高位补符号位
- 顺序结构
语句按照一定的先后顺序去执行
五、选择结构
单分支选择结构
If(表达式)
{
语句;
}
先判断表达式是否成立,如果成立,执行语句;
双分支if语句
if(表达式)
{
语句1;
}
else
{
语句2;
}
多分支if语句结构
If(表达式1)
{
语句1;
}
else if(表达式2)
{
语句2;
}
。。。。
else if(表达式n-1)
{
语句n-1
}
Else
{
语句n;
}
switch语句
switch(表达式)
{
case 标号1:
语句1;
case 标号2:
语句2;
。。。。。
case 标号n:
语句n;
default:
语句n+1;
}
六、循环结构
for循环
for(表达式1;表达式2;表达式3)
{
循环体;
}
表达式1:循环的起始条件
表达式2:循环的终止条件
表达式3:循环变量的变化
while语句
While(表达式)
{
循环体;
}
do...while语句
do
{
循环体;
}while(表达式);
死循环
1、
while(1)
{
循环体;
}
2、
For( ; 1 ; )
{
循环体;
}
goto语句
无条件跳转语句
goto 标号;
标号:
- 数组
一组数据类型相同的元素的集合
存储类型 数据类型 数组名[元素个数];
存储类型:auto,static,extern,register
数据类型:数组中每一个元素的数据类型
数组的数据类型:数据类型 [元素个数]
变量的数据类型:去掉变量名剩下的就是变量的数据类型
数组所占内存空间=sizeof(数据类型)*元素个数
- 冒泡排序
思想:从左到右,俩俩依次比较,如果前一个比后一个大,交换位置,否则不变
- 字符数组
字符数组的本质:其实就是字符串,以’\0’作为结束符
存储类型 数据类型 数组名[元素个数];
字符数组的输出函数
puts(数组名);
功能:将数组的内容输出打印到终端,并且自动添加换行
注意:遇到’\0’结束
字符串的输入函数
gets(数组名);
功能:将键盘接收到的字符串存放到数组中,并且再末尾自动添加’\0’
Scanf和gets的区别
gets以回车作为结束符,但是scanf以回车,tab,空格作为结束符
缓存区:
gets:当完成字符串的输入后,会自动清空缓冲区的内容
Scanf:当完成字符串的输入后,缓冲区会遗留空格,回车,tab
注意:
gets首先会检测缓冲区是否有内容,如果有直接拿来使用,否则输入
Scanf是标准的输入函数,只能通过键入方式
Printf和puts区别
Puts会自动添加换行,printf不会
十、字符串的处理函数
求字符串的长度
strlen(数组名);
功能:求字符串的长度
返回值:求得的字符串的实际长度,不包含’\0’
sizeof与strlen区别:
- strlen是求得的字符串的实际长度,不包含’\0’,而sizeof是求得的整个空间大小
- sizeof是运算符,strlen是库函数
字符串的拷贝函数
strcpy(数组1,数组2/字符串2);
功能:将数组2的内容拷贝到数组1中,包含’\0’,相当于完全拷贝
字符串的连接函数
strcat(数组1,数组2/字符串2);
功能:将数组2或者字符串2的内容连接到数组1中,数组1的’\0’会被覆盖
字符串的比较函数
strcmp(数组1/字符串1,数组2/字符串2);
功能:比较字符串1和字符串2的大小
返回值:
大于0:字符串1>字符串2
等于0:字符串1==字符串2
小于0:字符串1<字符串2
比较规则:
从左到右依次对字符串的ASCII码进行比较,直到遇到不同的,或者遇到’\0’结束
十一、二维数组
本质:表示元素为一维数组的数组(数组的数组)
存储类型 数据类型 数组名[行数][列数];
行数:有几个一维数组
列数:一维数组中有几个元素
- 函数
函数的分类
库函数
printf,sancf,strlen
引入头文件
#include<stdio.h>
#include<string.h>
调用函数
Strlen(str);
函数名(实际参数列表);
自定义函数
存储类型 数据类型 函数名(形式参数列表);
{
函数体;
返回值;
}
存储类型:auto,static,extern,register
数据类型:返回值的数据类型
函数名:见名知意
形式参数列表:要实现的功能所需要的参数,需要调用者自己传入(1.需要几个2.每个参数的数据类型)
函数体:具体实现的功能
返回值:如果没有返回值,可以省略,不需要写return,数据类型 void,如果有,有且仅有一个
调用函数
函数名(实际参数列表);
注意:
- 需要将实参的值传递给形参,实参的个数和数据类型必须和形参保持一致
- 实参可以是变量,常量,表达式,必须是一个确定的值
- 实参和形参是俩快独立的内存空间
- 传参实际上是将实参的值拷贝给了形参
- 形参是局部变量,在函数调用的时候被定义,函数调用结束,释放空间
十三、指针
指针是一种数据类型,是一种保存地址的数据类型。
什么是地址
内存分配的最小单位是字节,每一个字节都有一个编号,我们把这个编号叫做地址
地址的本质:内存单元的编号
指针:指针就是地址
指针的本质:内存单元的编号
指针的定义
存储类型 数据类型 *指针变量名;
int *p;
存储类型:auto,static,register,extern
数据类型:指针所指向的数据类型(去掉*和变量名,剩下的就是指针所指向的数据类型)
指针的数据类型:数据类型 *//int *
赋值
char *p = &a;
char *p = NULL;
p = &a;
地址传递
- 二级指针
指针的指针
二级指针他的内存空间存放的就是一级指针的地址
定义
存储类型 数据类型 **指针变量名;
- 指针的数据类型,去掉变量名剩下的就是
- 指针指向的数据类型,去掉一个*和变量名剩下的就是所指向的数据类型
- 指针指向的数据类型,去掉一个*和变量名剩下的就是所指向的数据类型
指针的算数运算
p+n:p+n相对于p向地址增大的方向移动了n个数据
实际的变化:p+sizeof(指向的数据类型)*n
p-n:p-n相对于p向地址减小的方向移动了n个数据
实际的变化:p-sizeof(指向的数据类型)*n
p++:p向地址增大的方向移动了一个数据
p--:p向地址减小的方向移动了一个数据
p-q:(p和q的数据类型必须一致)这俩个指针之间相隔的个数
实际的变化:(p-q)/sizeof(指向的数据类型)
- 数组指针
指向数组的指针
存储类型 数据类型 (*指针变量名)[元素个数];
存储类型:auto,static,extern,register
数据类型:数组指针指向的数组中元素的数据类型
指针的数据类型:数据类型 (*)[元素个数]
元素个数:指针所指向的数组中的元素个数
数组指针和一维数组
数组指针和二维数组
- 指针数组
元素为指针的数组
存储类型 数据类型 *数组名[元素个数];
数据类型 *:数组中元素的数据类型
指针数组与二维数组