day16

目录

[1 联合体的定义和使用](#1 联合体的定义和使用)

[2 联合体的内存布局](#2 联合体的内存布局)

[3 联合体的应用](#3 联合体的应用)


1 联合体的定义和使用

cpp 复制代码
#include <iostream>

using namespace std;

struct DataS
{
	int i;	
	double d;	
	char s[10];	
	
};

/*
	联合体 所有成员共享同一段内存  
		   修改一个成员会影响其他成员
{
*/
union DataU
{
	int i;		//4个字节
	double d;	//8个字节
	char s[10];	//10个字节
	//联合体成员大小由最大的成员决定,因此该联合体的大小是10个字节
};
/*
1、定义和使用分开
union DataU
{
	int i;		//4个字节
	double d;	//8个字节
	char s[10];	//10个字节
	//联合体成员大小由最大的成员决定,因此该联合体的大小是10个字节
};
DataU a,b,c;
2、定义和使用结合
union DataU
{
	int i;		
	double d;	
	char s[10];	
}a,b,c;
3、匿名:不想让别人使用
union
{
	int i;
	double d;
	char s[10];
}a,b,c;
*/
int main()
{
	DataS ds;
	cout << &ds.i << "," << &ds.d << "," << (void*)ds.s << endl;

	DataU du;
	cout << &du.i << "," << &du.d << "," << (void*)du.s << endl;
	return 0;
}

2 联合体的内存布局

cpp 复制代码
#include <iostream>
using namespace std;

union DataU {
    int i;      // 4
    double d;   // 8
    char s[7];  // 7
};

int main() {
    cout << sizeof(DataU) << endl;
    DataU du;
    du.s[0] = 255;      // 11111111
    du.s[1] = 1;        // 00000001
    du.s[2] = 0;        // 00000000
    du.s[3] = 0;        // 00000000
    cout << du.i << endl; // 00000000 00000000 00000001 11111111
    du.i = 256;
    cout << (int)du.s[0] << (int)du.s[1] << (int)du.s[2] << (int)du.s[3] << endl;

    return 0;
}

3 联合体的应用

cpp 复制代码
#include <iostream>

using namespace std;

struct Info
{
	char _name[20];
	int _role;
	union 
	{
		double score;
		char course[20];
	}_sc;

	Info(const char name[20], int role, double s, const char c[20]) {
		strcpy_s(_name, name);
		_role = role;
		if (s > 0) _sc.score = s;
		if (strlen(c) > 0) strcpy_s(_sc.course, c);
	}
};

int main()
{
	Info a[4] = {
		Info("周老师", 0, -1, "CGaGa"),
		Info("周老师", 0, -1, "Python"),
		Info("周同学", 1, 90, ""),
		Info("肖同学", 1, 88, ""),
	};

	for (int i = 0; i < 4; i++)
	{
		if (a[i]._role == 0) {
			cout << a[i]._name << "是一位老师,他是教" << a[i]._sc.course << endl;
		}
		else if (a[i]._role == 1) {
			cout << a[i]._name << "是一位学生,他的分数是" << a[i]._sc.score << endl;
		}
	}
	return 0;
}
相关推荐
xiaoye-duck1 小时前
《C++ 工具库实战》gflags 命令行参数解析库详解
c++·第三方库
OpenAnolis小助手1 小时前
PHP 两个严重漏洞曝光,龙蜥社区 24 小时完成 3 版本修复
开发语言·操作系统·php·龙蜥社区
狂奔的sherry2 小时前
C++ 宏生成访问函数的代价:访问权限、调试和类型检查
c++·宏·编译·预处理器·类型检查
阿尼卡~2 小时前
VS Code 配置 C 语言开发环境(Windows 10/11):从 GCC 安装到运行、断点调试,一篇搞定
c语言·开发语言·windows
划破黑暗的第一缕曙光3 小时前
[C++]:5.STL:string(2)
java·c++·redis
hhhjhl3 小时前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu
染指11103 小时前
158.Agent-LangGraph-子图(共享状态和不共享状态模式)
开发语言·人工智能·python·ui·agent·agents
wangchunyu1143 小时前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
slongzhang_3 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
云和数据.ChenGuang5 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节