c语言:Struct-创新互联
struct stu
{
char name[20];
int age;
}s1,s2;//s1,s2是结构体全局变量
int main()
{
struct stu s3,s4//s3,s4是结构体局部变量
return 0;
}
typedef 重命名:typeddf struct stu
{
char name[20];
int age;
}stu;
stu s5,s6;//不用再写struct
匿名结构体:创建变量必须紧跟结构体声明,只能用一次(指向同样的类型的结构体指针不能存放结构体地址,系统认为不相同)
struct
{
char name[20];
int age;
}x;
结构体指针声明:struct stu
{
char name[20];
int age;
}*p;//p为指向 stu结构体的指针
结构体自引用:在结构体中引用结构体,如链表struct Node
{int value =0;
struct Node* next
};
结构体自引用的typedef:struct Node
{int value =0;
struct Node* next
};
结构体变量定义及初始化的三种方式struct stu
{
char name[20];
int age;
}s1={"amy",12};
struct stu s2={"tom",12};
int main()
{
struct stu s3={"jack",12};
return 0;
}
乱序初始化:struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s3={.name="jack",.age=12};
return 0;
}
结构体访问:struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s3={"jack",12};
printf("%d",s3.age);
return 0;
}
结构体内存对齐:结构体内存对齐规则:
struct s1
{ char c1;
int i;
char c2;
};
结构体内存对齐规则:
第一个成员在偏移量为0处
2.从第二个成员开始,每个成员放在对齐数的整数倍处
(对齐数=结构体成员大小和默认对齐数中的较小值,vs是8,Linux无默认是成员自己本身大小)
3.结构体大小是大对齐数的整数倍
选择被嵌套的结构体成员变量的大对齐数作为起始地址,大小为被嵌套的结构体字节
结构体的大偏移数包括嵌套结构体的偏移数
数组看成多个独立数据数据,对齐数看数组类型
解析:c1是第一个成员地址在偏移量为0处
c1和i中的空间被浪费掉
大对齐数是i的4,能装下所有的成员,以及为4的最小整数为12,即结构体内存大小
检验:
宏offsetof计算成员偏移量
printf("%d\n",offsetof(struct s1 c1));
对齐原因:硬件只能访问某些特定地址的对齐数
对齐处理器要一次内存访问,非对齐要两次
如图:非对齐访问i要访问两次,而对齐访问i只要访问一次
设计结构体时尽量把空间小的成员放在一起
修改默认对齐数:#program pack()
#program pack(4)//默认对齐数是4
#prgram pack()//恢复默认对齐数
#program pack(1)//默认对齐数为1,相当于无默认对齐数
结构体传参:
传值和传地址
传参要压栈,选结构体地址
void print1(struct s s1)
{;}
void print2(struct s* ps)
{;}
位段:位:二进制位成员必须是整型家族int,unsigned int 或char (一般同类型)
位段成员名后边有一个冒号和数字
struct A{
int _a:2;//表示只占两个比特位
int _c:5;
int _c:5;
}
位段开辟:以(int)4个字节或(char)1个字节开辟空间
//先开辟32个字节 能装下_a,_b,_c不够再开辟4个字节
计算位段大小:struct A{
char a:3
char b:6
char c:3
}
int main()
{char a=9;
char b=3;
char c=4;
}
在vs环境下
分析:截断:9(2):1001->001 放入数据低位
剩下的比特位不足以放6个字节,再开辟1个字节空间(int 就4个字节)。
跨平台问题:
位段中int是有符号还是无符号不确定
位段int的大小是不确定的
位段使用一个字节的方式不确定(使用低位还是高位?)
当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时时,是否舍弃位还是利用是不确定的。(vs中舍弃)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享名称:c语言:Struct-创新互联
网页路径:http://scyanting.com/article/jpohj.html