C语言之共用体

1:共用体(union)类型的定义

union myunion
{
int a;
char b;
};
int main(void)
{
myunion u1;
u1.a = 23;
printf("u1.b = %d\n", u1.b);     //23
printf("&u1.a = %p \n",&(u1.a));  //&u1.a = 0xbfbe5c04
printf("&u1.b = %p \n",&(u1.b));  //&u1.b = 0xbfbe5c04

}

总体上来讲共用体和结构体的定义方法很类似,使用方法也基本一样

2:共用体和结构体的区别

(1)结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。也就是说共用体是同一个内存空间,里面存放的数值(二进制)是一样的,使用u1.a去访问这个内存时是按int类型去解析这个内存空间,使用u1.b去访问这个内存时是按char类型去解析这个内存空间。总的来说共用体就是同一块存放着二进制数的内存空间的不同理解方式。

(2)使用sizeof去测量共用体的大小时,测得的是union中各个元素里面占用内存最大的那个元素的大小。因为这样才能够存放下所有的元素。

(3)union中的元素不存在内存对齐的问题,因为union中实际只有1个类型的内存空间,都是从同一个地址开始的(开始地址就是整个union占有的内存空间的首地址),所以不涉及内存对齐。

3:共用体的主要用途

(1)共用体就用在那种对同一个内存单元进行多种不同规则解析的这种情况下。

(2)C语言中其实是可以没有共用体的,用指针和强制类型转换可以替代共用体完成同样的功能,但是共用体的方式更简单、更便捷、更好理解。

时间: 2024-12-29 07:21:43

C语言之共用体的相关文章

(C语言)共用体union的使用方法举例

曾经在学校学习C语言的时候一直搞不懂那个共用体union有什么用的.工作之后才发现它的一些妙用,现举比例如以下: 1. 为了方便看懂代码. 比方说想写一个3 * 3的矩阵,能够这样写: [ 注:以下用红色部分标记的地方是后来加入上去的,谢谢yrqing718的提醒!] struct  Matrix { union { struct { float  _f11, _f12, _f13, _f21, _f22, _f23, _f31, _f32, _f33; }; float  f[3][3]; }

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

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

「C语言」「例题」结构体与共用体

本篇收集<C语言程序设计教程>第九章“结构体与共用体”的所有例题. 1 #include <stdio.h> 2 3 /*输入一个学生的基本信息, 4 包括学号.姓名.性别.年龄.出生日期.三门成绩, 5 输出该学生的基本信息和平均成绩*/ 6 7 struct date 8 { 9 int year;/* 年份 */ 10 int month;/* 月份 */ 11 int day; /* 日期 */ 12 }; 13 14 struct student 15 { 16 char

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

瘋子C语言笔记(结构体/共用体/枚举篇)

 (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name[20]; char sex; int age; struct date birthday; /*birthday 是 struct date 类型*/ char addr[30]; }student1,student2; (1):结构体可嵌套 (2):与枚举相比结构体内元素为变量,而枚举为常

C语言:结构体,共用体

结构体: 一个变量,存储不同类型的数据项共用体:一个变量,存储不同类型的数据项,相同的内存位置,存储不同的数据类型 #include <stdio.h> #include <string.h> struct Books { char title[50]; char author[20]; }; union Data { char title[50]; char author[20]; }; main() { union Data _u; struct Books _s; print

C语言:结构体和联合体(共用体)

结构体:struct 1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2.结构体每个成员相对于结构体首地址的偏移量(offset)都是成员的整数倍. 3.结构体的总大小为结构体最宽基本类型成员大小的整数倍. cpu的字长: 32位的cpu或64位的cpu 32位或64位指的是cpu的字长 字长实际上指得是cpu在访问内存时,一次可以读取的长度. 内存对齐(可以设置,一般是2的倍数,虽然浪费了空间,但是方便了cpu更好更快的取出数据): char  4个字节 int    4个字节

C语言结构体和共用体_07

概述 定义结构体类型变量的方法 结构体变量的引用 结构体变量的初始化 结构体数组 指向结构体类型数据的指针 用指针处理链表 共用体 枚举类型 用 typedef定义类型  概述 定义一个结构体的一般形式: struct 结构名 { 成员列表 }; 一个结构体有一个结构名,但不是必须的.成员列表有若干个成员组成,每个成员都是该结构的一个组成部分.对每个成员也必须作类型说明,其形式为: 类型说明符 成员名; 例如: // 学号.姓名.性别.年龄.地址等属性 struct Student { int

C语言 共用体

//共用体 union #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> // union 共用体,构造数据类型,也叫联合体,用途:十几个不同类型的变量共占一段内存(相互覆盖) //共用体在类型定义的时候并不分配内存,定义共用体变量的时候才分配内存 union data{ char c; int a[10]; }udat1; union stu{