哑元 结构

哑元结构的构成

哑元结构分为:

  • 无名结构体
  • 无名联合体

区别自定义类型

注意:对于内置类型不能如下定义变量

int int;//eror

这样是不合法的,因为int 是关键字
但是可以这样定义结构体变量:因为对于自定义的结构体变量名字不是关键字

struct Node Node;

定义成全局变量初始值都是0
定义成局部变量初始值都是随机值

无名结构体:

struct
{
		char ch[2];
		short sx;
}x;
	
struct
{
	char ch[2];
	short sx;
}y;

注意:不能认为x与y是同一种类型,因为在编译链接过程中,编译器给2个无名结构不同的名字,所以x和y是不同类型的结构体变量。

无名联合体

注意:只有一种结构不占空间:上面有,下面没有,是类型,类型只有定义变量才有意义,单独谈论就是图纸,不占内存

1.上面有,下面没有:不占内存

struct stu
{
	int a;
	union A
	{
		int b;
	};
};
stu a;
sizeof(a);//4字节

2.上面有,下面有

struct stu
{
	int a;
	union A
	{
		int b;
	}A;
};
stu a;
sizeof(a);//8字节

3.上面没有,下面有

struct stu
{
	int a;
	union 
	{
		int b;
	}A;
};
stu a;
sizeof(a);//8字节

4.上面没有,下面没有

struct stu
{
	int a;
	union 
	{
		int b;
	};
};
stu a;
sizeof(a);//8字节

区别一:

注意此时X占用8字节

struct Node
{
	char ch;
	union
	{//a成员和f成员共用同一存储空间
	  int a;
	   float f;
	};
};
	
int main()
{
	Node x;//x虽然有3个数据成员,但是a和f被联合体包裹,共享空间 
	x.ch = 'x';
	x.a = 10;
	return 0;
}

区别二:

此时定义变量Node x 则x只占用1字节
因为此时a 和f 不是变量x的成员,AF是类型,类型是图纸,

struct Node
{
	char ch;
	union AF
	{
		int a;
		float f;
	};
};
int main()
{
	Node x;
	printf("%d \n", sizeof(x));// 1字节
	Node::AF y;//4字节
	return 0;
}

区别三:

此时变量x有2个数据成员:ch 和 AF

struct Node
{
	char ch;
	union 
	{
		int a;
		float f;
	}AF;//无名联合体定义了一个变量AF
};
int main()
{
	Node x;
	printf("%d \n", sizeof(x));// 8字节
	x.ch = 'a';
	x.AF.a = 10;
	return 0;
}

区别四:

变量x具有2个成员

  • ch是数据成员
  • AF是类型成员,系统不分配内存空间
struct Node
{
	char ch;
	typedef union
	{
		int a;
		float f;
	}AF;//AF变成了一种类型
};
int main()
{
	Node x;
	printf("%d \n", sizeof(x));// 1字节
	Node::AF y;// y里面有 a 和 f
	printf("%d \n", sizeof(y));// 4字节


	return 0;
}

结构体与联合体相互套用

结构体与联合体相互套用时非常重要,主要示例:IP地址转换

union Node
{
	struct
	{
		char a;
		char b;
	};
	short sx;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值