自学嵌入式 day 17- c语言-第11章 结构体与共用体 第12章 位运算
第十一章 结构体与共用体
11.1 结构体
声明:
struct Student //结构名,符合标识符规则,第一个字母大写
{
int id;
char name;
float score;
};
定义:
struct Student(结构名) s(变量名);
s.id = 1;//“ . ”结构体运算符,优先级为1,表达式为int 型
strcpy(s.name,"zhangsan");
s.score = 77;
作用:将不相关的内容打包,封装在一起,可统一引用。
(1)声明可放在头文件中,可在声明后定义变量,具有全局作用域,是全局变量。
(2)初始化:
struct Student s = {1,"zhangsan",77};
次序于声明顺序一致,且可选择元素初始化 s = {.id = 1,.score = 77};结构体成员部分初始化。
(3)结构体变量与变量之间可整体赋值。
考点:下列结果为:
printf("%d\n",sizeof(struct Student));
内存对齐:cpu与RAM之间由地址总线,数据总线、控制总线连接,其中数据总线有32根,一次性传递32个比特,也就是4个字节,cpu访问时以4个字节为单位,所以系统存储数据时会将变量的地址放在可被四整除的位置上,方便cpu访问,这个过程为内存对齐。
解法:
(1)默认按照计算机位数对齐,若计算机位数为64,则最终大小必须为64 / 8 = 8的整数倍。
(2)从结构体成员中查找字节数最大的成员,最终大小按此成员大小对齐。
(3)把每个成员按照声明顺序依次存入内存,偏移量 / sizeof(成员)必须整除。
注:
(1)-> :指向结构体成员运算符,当成员用指针指向时可用。
(2)结构体不可整体比较,可被整体赋值。
11.2 共用体
声明:
union 共用体名
{
...
} ;
(1)成员共享内存空间,从字节的起始部分开始共享。
(2)其值会被最后成员的值覆盖。
用法:判断小端存储
union Demo
{
int i;
char j;
};
int main(void)
{
union Demo s ;
s.i = 1;
if(d.c == 1)
{
puts("little");
}
else
{
puts("big");
}
}
补充:可用指针判断小端存储
int main(void)
{
int i = 1;
char *j = (char *) &i;
if(*j == 1)
{
puts("little");
}
}
11.3 枚举类型
声明:
enum 枚举类型名
{
...
};
定义:
enum 枚举类型名 变量名;
11.4 用typedef定义类型
typedef 数据类型 数据名
好处:使用类型时可简化复杂的类型名称;
坏处:代码可读性降低;
第十二章 位运算
操作数必须是整形或者与整形相兼容的类型。
12.1 位运算符
(1)按位与-" & ",指定位清零
参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
(2)按位或-" | ",指定位置1
两个相应的二进制位中只要有一个为1,该位的结果值为1。
(3)按位异或-" ^ ",指定位翻转
若参加运算的两个二进制位同号,则结果为0(假);异号则为1(真)。
(4)按位取反-" ~ "
是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。
(5)左移-"<<"
用来将一个数的各二进制位全部左移若干位,右边只补零。
补充:
①指定位清零
②指定位置1
(6)右移-">>"
无符号数右移补零,逻辑右移,有符号数右移补1,算数右移。