0507学习总结(结构体,共用体,枚举等)

来源:互联网 发布:scala 知乎 编辑:程序博客网 时间:2024/06/10 18:01
1.结构体
保存数据的两种方式:1.定义变量 2.数组
数组的特点:(1)保存的相同类型的数据
(2)数组的大小定义后就无法改变
结构体中有哪些操作:封装的作用
(1)定义:
(2)具有哪些和变量相同的作用:初始化、打印
1.struct student s1 = {.name = "wang",.num = 16,.isMale = 1};
2.struct student s1 = {name:"wang",num:13,isMale:1}
3.struct student s1 = {"wang",17,10}

2..运算符和->运算符的区别
->运算符用于指针变量

本质上都是对地址操作

3.总结
(1)它只是把现有的数据类型进行封装
(2)定义结构体时,并没有分配内存空间
(3)只有定义具体的结构体类型的变量时,才进行分配空间
(4)结构体定义最后要加分号

4.用sizeof测量结构体所占的内存空间
不是将内存空间简单的相加,而是涉及到内存对齐的问题。

内存对齐?
理论上说,任何变量的访问都可以从任何地址开始访问。但有些特殊类型的变量只能在特定的地址访问。

对齐参数的概念。
(1)变量本身的对齐参数
(2)系统默认的对齐参数

2个原则
(1)每个变量相对于结构体的首地址的偏移量必须是对齐参数的整数倍
(2)结构体变量所作用的空间大小是对齐参数的整数倍
1.结构体中有int,long,double对齐就是4字节
2.没有int,long,double时,对齐就是2字节
3.就是以结构体里面占用空间最大的为准 
(3)结构体中变量的结束标志不是由本身变量所决定,而是由下一个变量决定的

手动确定格式:
(1)#pragma pack(n) //开始
(2)#pragme pack    //结束(在gcc中不建议使用)

__attribute__((packed))和__attribute__((aligned(n)))

5.为什么要有对齐方式?
主要是配合硬件,提高效率

6.共用体
union myunion
{
   int a;
char b;
};
(1)共用体和结构体的操作类似
(2)结构体中的变量时相互独立,互不干扰的
(3)共用体占用同一块内存空间
(4)共用体中内存空间的大小是以内存空间中最大的变量类型决定的
(5)本质上还是指针来操作


7.大小端模式
首先一开始引用于串口通信模式
上位机给下位机发送int类型的数据,byte0,byte1,byte2,byte3,发送和接收的时候需要考虑是从高字节发送还是从低字节发送,然后在计算机的存储时也存在大小端模式

高字节放在低地址就是大端模式
高字节放在高地址就是小端模式

通过代码测试机器是什么模式
(1)根据共用体
union myunion
{
   int a;
char b;
};
int is_little_endion()
{
   union myunion u1;
u1.a = 1;
return n1.b;
}
int main()
{
   int result = is_little_endion;
   if(result == 1)
{
   小端;
}
else
{
   大端;
}
}
(2)
int a = 0x123478;
char p = a;
if(p == 0x78)
{
   小端;
}
else
{
   大端;
}


8.枚举
(1)什么是枚举
枚举是整形常量的集合
(2)怎么用
例子:enum demo {A,B,C}
enum demo 
{
   a,
b,
c
};
(3)枚举的特点:
1.整形的常量
2.第一个元素默认为0,后面的比前面大1
(4)枚举和宏定义的区别
有些情况下,宏定义的个数有限,但是也比较多,可以采用枚举类型来替代宏定义
1.枚举是有类型的
2.宏定义是在预处理阶段处理,枚举是在编译阶段处理
3.需要大量的宏定义可用枚举替代(整形)
4.枚举类型的用法比较单一

9.位运算
(1)位与 &
(2)位或 |
(3)位异或 ^ (当两个数不一样的时候进行或操作)
前后两个值相等的时候结果为0,不相等的时候进行或操作
(4)左移操作 《
5<<2
第一步先左移1位,01010 = 10 = 5x2
然后再左移1位, 010100 = 20 = 5*2*2
(5)右移操作 >>
5>>2
先右移1位,0010 = 2 = 5/2
再右移1位,0001 = 1 = 2/1
(6)取反 ~
~0 = 1   ~1 = 0

对于int a
(1)给特定位清0
将a和由0和1组成的特定的数进行位与操作,可达到清0的目的
(2)给特定位设置为1
将a和由0或1组成的特定的位或操作,可达到设置为1的目的
(3)给特定位取反
将a和由0或1组成的数进行取反操作

给5的bit3~bit7设置为1
1.用软件或工具,直接构造248,但看起来不明显
2.位运算构造,但容易出错
ox1f == 11111 //bit0~bit4设置为1
0x1f << 3     //111111000

bit3~bit7和bit23~bit25设置为1
0x1f << 3
0x07 << 23,a = 0
a | 0x1f << 3 | 0x07 << 23
0 0
原创粉丝点击