自定义类型---结构体(下)和联合体

  • struct结构体--struct的对齐规则:先看一个代码:
    #include<stdio.h>
    #include<string.h>
    //struct的对齐规则
    struct S
    {
    	char a;
    	int b;
    	char n;
    };
    int main()
    {
    	struct S s;
    	printf("%d ", sizeof(struct S));
    	return 0;
    }

    这个代码中:打印出来的是12,但是我们知道char类型的是1个bite,int类型的是4个bite,那么不就是6个bite吗?为什么是12个呢?这就要讲到我们所说的struct的对齐规则了。它的原理其实很简单:1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处。

                          2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。

如果是这一个代码:

struct S s3
{
	char a;
	int b;
	char n;
};



struct S4
{
	char c1;
	struct S3 s3;
	double d;
};
int main()
{
	struct S s4;
	printf("%d ", sizeof(struct S4));
	return 0;
}

这就需要另一个关于struct的对齐规则的是:如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

  • 结构体的传参:t它的代码为:
    struct S
    {
    	int data[1000];
    	int num;
    };
    struct S s = { {1,2,3,4}, 1000 };
    //结构体传参 
    void print1(struct S s)
    {
    	printf("%d\n", s.num);
    }
    //结构体地址传参 
    void print2(struct S* ps)
    {
    	printf("%d\n", ps->num);
    }
    
    int mian()
    {
    	print1(s); //传结构体 
    	print2(&s); //传地址 
    	return 0;
    }

    对与传参的代码,传地址比传结构体好的多。

  • 我们再来总结一下,对于strucrt结构体,只需要知道它是如何创建和初始化的,以及它的结构体内存对齐。
  • 联合体(union):它还有另一个名字叫做:共用体。它的创建和初始化则代码为:
    //联合体的创建和初始化:
    union Un
    {
    	char c;
    	int a;
    };
    int mian()
    {
    	//联合体变量的定义
    	union Un un = { 0 };
    	//计算连个变量的大小
    	printf("%d\n", sizeof(un));
    	return 0;
    }

    它的输出结果:4;那就想了,为什么结构体的是12,而联合体的是4呢?这就提到了前面所说的,联合体是一个共用体。它和结构体有着本质的区别,

  • 联合体大小的计算:举一个例子:我们要搞⼀个活动,要上线⼀个礼品兑换单,礼品兑换单中有三种商品:图书、杯⼦、衬衫。 每⼀种商品都有:库存量、价格、商品类型和商品类型相关的其他信息,比如,设计这三个变量:图书:书名、作者、⻚数 。杯⼦:设计。 衬衫:设计、可选颜⾊、可选尺⼨。则代码为:

    struct gift_list
    {
    	int kucun_liang;//库存量
    	char jia_ge;//价格
    	int item_type;//商品类型
    	union
    	{
    		struct
    		{
    			char title[20];//书名
    			int name[10];//作者
    			char num_pager;//页数
    		}book;
    		struct
    		{
    			char desight[30];//设计
    		}mug;
    		struct
    		{
    			char desight[20];//设计
    			int jian_se;//可选颜色
    			int size;//可选尺寸
    		}shirt;
    	}item;
    };
    
    

    这就遇到了struct中嵌套了union。

  • 结构体和联合体就写完了,它们的最重要的一部分就是struct和union的创建和初始化以及理解。你会了吗?

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值