C 结构体 位段

结构:结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
结构成员的类型:结构的成员可以是标量、数组、指针、甚至是其他结构体
结构体的声明
typedef struct Stu //typedef 类型重命名
{
char name[20];
int age;
char sex[5];
char id[20];
}Stu; //分号不能丢
结构体变量的定义
struct Point
{
int x;
int y;
}p1; //声明的同时定义变量p1
struct Point p2; //定义结构体变量p2
结构体的初始化
struct Node
{
struct Stu
{
char name[15];
int age;
};
struct Stu s={“zhangsan”,20}; //初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1={10,{4,5},NULL}; //结构体嵌套初始化
结构体传参:
void printf1(struct S s) //结构体传参,不发生降维
{
printf("%d\n",s.num);
}
void printf2(struct S* ps) //结构体地址传参
{
printf("%d\n",ps->num;
}
**结构体传参的时候,要传结构体地址。**因为函数传参的时候,参数需要压栈。如果传递一个结构体对象时,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降
结构体的内存对齐:拿空间换取时间
规则
1.第一个成员直接放,起始偏移量为零
2.其他成员在放入结构体时,起始偏移量要能够整除自身对齐数
对齐数=自身大小与设置的值(2的n次方)中的较小值
3.结构体总大小为最大对齐数的整数倍

位段:内部成员类型一样,压缩存储节省空间
位段的声明和结构体是类似的,但有三个不同:
1.位段的成员必须是int,unsigned int 或signed int 或char(属于整型家族)类型
2.位段的成员名后面有一个冒号和一个数字
3.位段涉及很多不确定因素,位段是不跨平台的,注意可移植的程序应该避免使用位段
比如:
struct A
{
int _a:2;
int _b:5;
int _c:10;
};

//计算结构体的大小
#include<stdio.h>
#include<Windows.h>

struct s1
{
	double d;
	char c;
	int i;
};
struct s2
{
	char c1;
	struct s1 s1;
	double d;
};
int main()
{
	printf("%d\n", sizeof(struct s1));//8+1 内存对齐 12+4=16
	printf("%d\n", sizeof(struct s2));//1+16 内存对齐 24+8=32
	system("pause");
	return 0;
}
16
32
请按任意键继续. . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值