第十一章 结构体与共用体
一、结构体
1、结构体
一般形式 【struct 标识符】
结构体中的标识符一般首字母大写;
【.】结构体成员运算符; 优先级 1 级 结合方向:从左至右;
【->】:指向结构体成员运算符;
eg:
#include<stdio.h>
struct Student
{int id;char name[10];float score;
}; //此处的分号不能省略;也可以在分号前定义变量,为全局变量;
int main(void)
{struct Student s;s.id = 1; //为id进行赋值;strcpy(s.name,"zhnagsan");s.score = 99;struct Student s1;s1 = s; //结构体的变量之间可以赋值printf( " %d %s %f\n",s.id,s.name,s.score);return 0;
}
结构体的作用:将不相关的东西打包封装在一起,方便使用;
注意:
结构体不可以整体赋值,因为类型不匹配;
eg:结构体的初始化;
程序:
注意:初始化时,次序不能颠倒;
不写的时候,默认为0;(称为结构体的部分初始化);
2、结构体在内存中所占的字节数
2.1 内存对齐
将变量按照4的整数倍进行存放,用空间换取时间,提高CPU的运行效率;
2.2结构体对齐原则
1、默认按照计算机位数对齐;64位电脑中 64 / 8 = 8,最终的大小必须为8的倍数;
2、从结构体的成员中查找最大字节的成员,最终以此成员大小对齐;
3、把所有的成员按照声明依次存放入内存,偏移量 / sizeof(成员),必须整除;
练习:
eg:(1)将结构体中的元素逆序输出:
用swap函数并调用;
(2)对结构体里面的元素进行排序:(分别用成绩,名字进行排序)
程序:
二、共用体
所有的成员公用相同的内存空间;4个字节;
定义:
注意:
在公共体中成员进行访问时,仅最后一位赋值是有效的;
总是从空间的起始位置进行共享的;
所有成员的首地址相同;
eg:判断电脑是大端存储还是小端存储:
三 、枚举类型
定义:如果一个变量只有几种可能的值,则可以定义为枚举类型。所谓“枚举”是指将变量的值-一列举出来,变量的值只限于列举出来的值的范围内。
和整型兼容的数据类型;
四、用typedef定义类型
给已有的数据类型,取一个别名;
int INT; //定义一个变量;
typedef int INT; //给int型取别名为INT;
第12章 位运算
一、位运算
位运算必须是整型或者与整型相兼容的数据类型,(枚举类型可以)
按位与“&”:指定位清零;
安慰或“|”:指定位变一;
按位异或“^”:指定为翻转,其他位不变;
按位取反“~”(单目运算符):按位取反:
左移“<<”:eg:p <<1————p向左移一位,最高位丢失,最低位补零;
左移“>>":eg:p >>1————p向右移一位,最低位丢失,最高位补零;(注意右移时是否有符号);有符号右移为算数右移,无符号右移为逻辑右移;
eg:将p的第0位,第三位,第六位变为1;
程序: