嵌入式c语言;数据结构
为什么嵌入式要选择c语言?
*c的可移植性好:能在不同平台的结构访问硬件。
*c具有简洁紧、使用灵活的语法机制,并能直接访问硬件。
*c具有高效的运行效率
1:直接访问硬件(对硬件初始化)、
内核(kernel)内编程:c语言嵌套汇编 2:汇编是低级语言
对硬件做复杂操作用c,c为高级语言
面向结构的语言与面向对象的区别?
面向结构:是为了解决具体事物
面向对象:解决宏观问题 只关心结果
优点:代码的复用性、维护性、扩展性
C&RC
C语言标准: ANSIC / C89
C99
数据类型:
什么叫数据类型:数据集合的划分,不同数据类型对CPU的意义不一样。
强制类型转化:
Char < int < float < double (隐式类型转化)
字节长度:位(bit)、字节、半字、字
1字节 = 8位
1半字 = 2个字节= 16位
字 = 4个字节= 32位
Char : 1字节
Int: 4字节
Short:2字节
Long: 4字节
Long long : 4字节
Float: 4字节
Double: 8字节
*对于任何类型的指针,都是4字节(在32为操作系统上)。
取值范围:unsigned char : 0~255
Char: char:-128~127
用typedef来对数据类型重定义,提高代码的移植性。
如:typedef unsigned char Char;
当有符号位和无符号位比较时,默认有符号数自动转化成无符号数。
Strlen 与 sizeof的区别
1:strlen是函数,而sizeof是运算符。
2:strlen遇到’\0’结束(不计算’\0’),而sizeof要计算’\0’。
常量与变量:
常量: 常量都是有符号位的、
变量:变量有三个特点
1:变量的数据类型
2:变量的作用域。
3:变量的内存区域。
一般我们使用的内存都是系统映射的虚拟内存。
虚拟内存地址空间的划分:
内核
栈空间 保存:局部变量、函数形参、自动变量。
堆空间 malloc、ralloc、calloc、(分配空间),用free()释放
bss:保存未初始化的全局变量(系统自动分配为0)
数据段
rodata:常量
.data(静态数据区):初始化的全局变量、static修饰的变量
代码段
特点:
栈空间:先进后出、 管理权限:系统
堆空间:先进先出、 管理权限:用户。
局部变量与全局变量:
局部变量:也叫内部变量,在函数内定义,且其作用域也仅限于函数内。
全局变量:也叫外部变量;在函数外定义的,其作用域是从其定义处到程序结束。
声明与定义:
定义:创建一个变量、分配内存空间,且每个变量只能定义一次。
声明:告知编译器,这个名字(变量)已经匹配在一块内存,但未分配内存。声明可多次。
左右法则: 先看变量右边,再看左边(右一次,左一次)
-----遇结束标志从右/左换到左/右
结束标志:分号”;”。 逗号”,”。括号”()”。
如:
1): int a ; 整型变量
2): int *a ; 整型指针变量
3): int **a; 整型指针的指针变量
4): int a[10]; 整型数组
5): int *a[10]; 整型指针数组变量
6); int (*a)[10]; 整型数组指针变量
7): int (*a)(int); 整型函数指针变量
8); int (*a[10])(int); 整型函数指针数组
9): int *(*(*fp1)(int))[10]
变量fp1:函数指针变量,该函数指针指向一个形参为int,返回值为数组指针,该数组
指针指向一个整型指针。
10): int *(*(*arr[5]) () ) ();
变量arr:函数指针数组变量,该函数指针数组的元素指向一个形参为空,返回值为
函数函数指针;该函数指针指向一个形参为空,返回值为整型指针。
11): float ( *( *b() ) [] ) ();
变量b:函数,形参为空,返回值为数组指针,该指针指向一个函数指针数组,该数组
指向形参为空,返回值为float函数。
12): void *( *c) (char , int (*) () );
变量c:函数指针变量, 指向函数形参为char,函数指针,返回值 void *。
13): float ( * ( *e [10 ] ) ( int * ) ) [ 5 ];
变量e:函数指针数组,该函数形参为int * ,返回值为指针数组,该数组元素都是float.