1.结构体大小计算=成员自生占的字节+成员之间的内存对齐偏移(空洞)
偏移量:每一个元素对其实元素地址差多少给字节
2.规则:1.每个成员的偏移量,必须是该成员的整数倍,比如int 类型的元素,他的偏移量一定是0 4 8 12 这种4的倍数,如果不够,就要补空洞。
2.结构体整体的大小,必须是结构体最大基础成员大小的整数倍
3.从0地址开始以此放成员,不满足对齐就空出字节
4.指针大小:64位=8字节,32位=4字节
3.例子:
struct Node
{
int data; // int:4字节
struct Node* next;// 指针:8字节
};
结构体大小:4+4+8=16
第二个4是空洞
struct Test{
char c; //1字节
int i; //4字节
};
结构体:1+3+4=8byte
总结:偏移量:结构体成员相对于结构体起始地址的字节距离。
内存对齐要求:成员存放的偏移量,必须是该成员类型大小的整数倍;结构体整体大小必须等于最大基础成员大小的整数倍。
若不满足对齐,编译器自动填充空白字节(padding),这些填充字节计入结构体总大小。
4.自定义结构体的自引用
struct Node //格式:struct 结构名:类比 struct Stu{}
{
int data;
struct Node*n;//它一定是引用地址
}
struct Node n=0;
5.switch规则
switch(表达式)
{
case A:
case B:
default:
}
表达式只能是整形:int char short,不可以是浮点型:float
case后面必须是整形常量/常量表达式,不能写变量,不能写浮点数
例子:
float x=1.5;int a=1,b=3,c=2;
A. switch (a+b)
{
case 1: printf(“*\n”);
case 2+1: printf(“**\n”);
} //不一定要case完全对应,它考的只是格式不是逻辑
B .switch ((int)x); //多了;这个是语法错误,但是他的强制类型转化是对的,把x弄成了整形
{
case 1: printf(“*\n”);
case 2 : printf(“**\n”);
}
C. switch (x)
{ case 1.0: … } //case后面不可以浮点数
D . switch (a+b)
{ case 1: …;
case x: … } //case后面不可以是变量
356



被折叠的 条评论
为什么被折叠?



