C——联合体(共同体)总结

联合体的特点

1、联合体是一种结构,在这个结构中可以不同类型的成员,但同一时间只能存放其中的一种。

#include <stdio.h>

union  Demo
{
	int a;
	char b;
	long long c;
};

int main(){
	union Demo demo;
	demo.a = 10;

	printf("a=%d\n", demo.a);
	printf("b=%d\n", demo.b);
	printf("c=%d\n", demo.c);
	return 0;
}

2、联合体所有成员的首地址都是一样的(共享同一块内存空间)。

#include <stdio.h>

union  Demo
{
	int a;
	char b;
	long long c;
};

int main(){
	printf("%p\n", &demo.a);
	printf("%p\n", &demo.b);
	printf("%p\n", &demo.c);
	return 0;
}

3、联合体所占的内存的长度,一般等于其最大成员的内存长度。

#include <stdio.h>

union  Demo
{
	int a;
	char b;
	long long c;
};

int main(){
	union Demo demo;
	printf("%d\n", sizeof(demo));
	return 0;
}

4、联合体成员的对齐方式要适合所有的成员。

#include <stdio.h>

union  Demo
{
	int a;// 4个字节
	char b;// 2个字节
	long long c;// 8个字节
	char d[11];// 11个字节
};

int main(){
	union Demo demo;
	printf("%d\n", sizeof(demo));
	return 0;
}

上面联合体变量demo的大小之所以不是11个字节而是16个字节,是因为这里存在节对齐问题:

11既不能被2整除,也不能被4,、8整除,因此补充字节到16,因此就符合所有成员自身内存对齐了。

这里可以看出联合体所占空间的大小,不仅取决于最大成员的内存大小,而且跟所有成员的数据类型有关系。其大小必须满足两个必须条件:

1、大小足够容纳其最宽的成员。

2、大小能被所有成员类型的大小所整除。

联合体内部指针成员变量

对于联合体来讲最基本的原则是,一次只操作一个成员变量,如果这个变量是指针,那么一定是处理完指针对应的内存之后再来使用其他成员。

时间: 2024-12-08 06:38:38

C——联合体(共同体)总结的相关文章

利用联合体通过串口收发浮点数

以下介绍两种方法,一种是利用指针,一种是利用联合体,时间宝贵的看客可以直接跳到第二种方法 这里只是讨论数据发送前和接收后的处理,不讨论具体发送过程 方法一:指针 UART串口有一个缺点,就是发送和接受是一个字节一个字节的接收,如果发送的浮点数那可怎么办啊? 有人会说,那就一个字节一个字节发送啊 那么,我先定义一个double data 32位机中,一个double类型占8个字节,也就是说 data需要拆分8块通过UART发送 how? 学习c语言的时候,你肯定读过这句话:指针是c语言的精髓 那就

结构体和联合体

定义: 结构体是将不同的数据类型组成一个新的数据类型(自定义数据类型) 联合是几个不同的数据类型共用同一个内存段(相互覆盖) 所占内存大小: 结构体变量所占内存长度是各成员占的内存长度的总和. 共同体所占内存大小主要看变量中起作用的成员是最后一次存放的成员,在存入新的成员后原有的成员失去了作用! Struct与Union主要有以下区别: 1. struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在.在

联合体(union)的使用方法和其本质

转自:http://blog.csdn.net/huqinwei987/article/details/23597091 1)联合体 union 的基本特性——和 struct 的同与不同 union :中文名“联合体,共用体”,在某种程度上类似结构体 srtuct 的一种数据结构,union 和 struct 同样可以包含很多种数据类型和变量 不过区别也很明显: struct 中所有变量是“共存”的——优点是“有容乃大”,全面:缺点是 struct 内存空间的分配是粗放的,不管用不用,全分配.

C 联合体

联合体和结构体最大的区别是: 结构体各个成员都有自己的内存空间 联合体所有的成员共用同一个内存空间,空间的大小取决于所有成员中占用内存空间最大的那个. 放一段代码: #include <stdio.h> #include <stdlib.h> typedef union _m {     int c;     char name[20]; }M; int main() {     system("color 2E");     printf("联合体 

结构体/联合体 所占用内存

1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 typedef struct Parameter{ 6 int a; 7 long b; 8 double c; 9 int d; 10 }Parameter; 11 12 typedef union Para{ 13 unsigned a; 14 double b; 15 long c; 16 int d; 17 }Para; 18

结构体,联合体,内存分配

#include<stdio.h> struct a{ char x[6]; int y; char z[6]; }; struct b{ int y; char x[6]; char z[6]; }; union c{ char x[6]; int y; char z[6]; }; int main() { printf("%d,%d,%d\n",sizeof(struct a),sizeof(struct b),sizeof(union c)); return 0; }

数组、结构体、联合体、枚举类型、类型转换

1.数组 int num[2] = { 1, 2 };//1×2,num[0]=1 int num[2][2] = { { 00, 01 }, { 10, 11 } };//2×2,num[1][1]=11 int num[2][2][2] = { {{000,001},{010,011}}, {{100,101},{110,111}} };//2个2×2数组,num[1][1][1]=111 2.结构体 #include <stdio.h> int main() { struct Famil

C语言union(联合体、共用体)及应用

C语言union(联合体.共用体)及应用 在结构体(变量)中,结构的各成员顺序排列存储,每个成员都有自己独立的存储位置.联合(union)变量的所有成员共享同片存储区/内存.因此联合变量每个时刻里只能保存它的某一个成员的值. 联合变量也可以在定义时直接初始化,但这个初始化只能对第一个成员进行.例如下面的描述定义了一个联合变量,并进行了初始化. 1 uunion data 2 { 3 char n; 4 float f; 5 }; 6 union data u1 = {3}; //只有u1.n被初

C的联合体和结构体区别

联合体与结构体是很容易混淆的概念.粗略一看,两者无论声明.定义还是定义对象的方式都很相似.然而这两个东西的概念和作用实际千差万别.首先,联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的使用权(即对内存的读写),而结构体各个成员各自拥有内存,各自使用互不干涉.所以,某种意义上来说,联合体比结构体节约内存.举个例子:typedef struct{ int i; int j;}A;typedef union{ int i; double j;}U;sizeof(A)的值是8,sizeo