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
保存数据的两种方式: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
- 0507学习总结(结构体,共用体,枚举等)
- 结构体、共用体、枚举
- 枚举,结构体,共用体
- 结构体 枚举 共用体
- 结构体、共用体、枚举
- 结构体、共用体、枚举
- 结构体、共用体、枚举
- 结构体/枚举/共用体
- 结构体 共用体 枚举
- C语言学习笔记-结构体、共用体、枚举
- 结构体,共用体,枚举体,typedef
- 面试笔记3(结构体、共用体和枚举)
- 复合数据类型(结构体 共用体 枚举)
- (C基础)结构体,共用体,枚举
- (四)结构体、共用体、枚举、字节对齐
- C++结构体、共用体、枚举
- chapter3 结构体 共用体与枚举
- 结构体、共用体、枚举和typedef
- 生产环境中使用Docker Swarm的一些建议
- 利用windows批处理定期访问数据库远程备份文件【1】
- 回调函数
- 《暗时间》摘要心得2
- cocos2dx3.10 带滚动条的ScrollView和TableView
- 0507学习总结(结构体,共用体,枚举等)
- 【Unity】关于发射子弹、导弹追踪的逻辑(笔记)
- 3.4.1.2_光标的闪烁效果
- java中“53”个关键字(含2个保留字)
- JVM(四) 类的加载
- android闪屏动画
- SpringMVC+Hibernate+Struts2开发环境
- WinForm简单的打包和部署
- python 与java中的小区别