C零基础视频-42-共用体

目录

  • 共用体的定义与使用
  • 共用体与结构体的比较

共用体的定义与使用

共用体的关键字是union,共用体是非基本数据类型,同结构体类似,我们需要先声明共用体类型,再利用自定义的类型去定义变量。

#include <stdio.h>
#include <string.h>

union MyUnion
{
    double dbWeight;
    int nID;
    char szName[8];
};

int main(int argc, char* argv[])
{
    MyUnion unionValue;
    unionValue.dbWeight = 3.14;
    unionValue.nID = 5;
    strcpy(unionValue.szName, "Jack");
    return 0;
}

共用体与结构体的比较

从以上的代码看,结构体与共用体的使用似乎非常相似:都是非基本数据类型,都需要先定义类型,再定义变量,都通过"."运算符取成员。
实则不然,它们最大的区别是:

  • 结构体最终占用的内存大小,是所有成员的相加的结果,各成员在内存中不重叠
  • 共用体最终占用的大小,按成员最大者计算,各成员共用内存

我们可以举生活中例子,比如我们有块公告板,公告板上每次会记录一条信息,但是信息的类型不同,有可能是:

  • 体重信息,double类型
  • 学号信息,int类型
  • 姓名信息,char数组类型

也就是说,三种情况都可能出现,但是不会同时出现。这就适合用共用体存放。

#include <string.h>

union MyUnion
{
    double dbWeight;
    int nID;
    char szName[8];
};

int main(int argc, char* argv[])
{
    MyUnion unionValue;
    unionValue.dbWeight = 3.14;
    printf("公告,体重:%f\r\n", unionValue.dbWeight);
    unionValue.nID = 5;
    printf("公告,学号:%d\r\n", unionValue.nID);
    strcpy(unionValue.szName, "Jack");
    printf("公告,姓名:%s\r\n", unionValue.szName);
    return 0;
}

我们也可以通过sizeof,来验证struct和union的不同。

#include <string.h>

union MyUnion
{
    double dbWeight;
    int nID;
    char szName[8];
};

struct MyStruct
{
    double dbWeight;
    int nID;
    char szName[8];
};

int main(int argc, char* argv[])
{
    printf("sizeof union:%d\r\n", sizeof(MyUnion));
    printf("sizeof struct:%d\r\n", sizeof(MyStruct));
    return 0;
}

原文地址:https://www.cnblogs.com/shellmad/p/11695669.html

时间: 2024-11-01 12:23:48

C零基础视频-42-共用体的相关文章

C零基础视频-39-结构体的定义与使用

目录 为什么要使用结构体 结构体的定义与使用 结构体的定义 定义结构体变量 引用结构体中的成员 为什么要使用结构体 生活中的事物,往往有多种属性,我们为了记录和表示他们,需要围绕一个事物,记录多中数据. 如一只宠物狗,他可能有:姓名.颜色.体重. 我们可以使用三个不同的变量记录它: #include <stdio.h> int main(int argc, char* argv[]) { char szName[20] = { "旺财" }; char szColor[20

C零基础视频-40-结构体指针

目录 结构体指针的定义 使用结构体指针引用结构体成员 结构体指针作为函数参数传递 结构体指针的定义 结构体指针的定义与基本数据结构的指针类似,使用"*"符号即可: #include <stdio.h> struct tagPetDog{ char szName[20]; char szColor[20]; char nWeight; }; int main(int argc, char* argv[]) { tagPetDog dog = { "旺财",

C零基础视频-41-使用结构体封装游戏角色

目录 关于游戏封装的思考 封装后代码 关于游戏封装的思考 原代码: #include <windows.h> #include <conio.h> #include <stdio.h> void MoveCursorTo(int nRow, int nCol) { COORD crdLocation; crdLocation.X = 2 * nCol; crdLocation.Y = nRow; SetConsoleCursorPosition(GetStdHandle

零基础入门之结构体字节对齐

一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址:另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是windows下是这样的,但在linux的gcc编译器下最高为4字节对齐),否则在前一类型后补0:这里特别提到的是数组一定要注意,而且在一些编程的技巧中,我们可以使用数组强制字节达到对齐的目的.这在网络编程中是很常见的. 举例:比如CHAR型占用空间为1字节,则其起始位置必须可被1整除.INT为4字节,其起

C零基础视频-45-内存的分区:全局区、栈区、堆

目录 为什么程序的内存有分区 程序运行时的内存分区 堆内存 不久的将来,我们要开始学习在C中动态申请和释放内存.在学习它们之前,我们先学习程序内存的分区,为掌握和理解动态申请.释放内存做好基础铺垫. 为什么程序的内存有分区 一般而言,我们的住房会分成多个区域(卧室.厨房.阳台.卫生间等),不同区域有不同的功能. 运行时,程序分区的道理也是一样的,它方便操作系统管理程序,内存的不同区域,功能不同. 程序运行时的内存分区 作为初学者,我们简单认识下,程序有全局区.栈区和堆区即可. 全局区:在main

C零基础视频-32-指针铺垫知识:计算机分级结构

目录 计算机的体系结构 什么是内存 指针 计算机的体系结构 冯诺依曼体系结构 哈佛体系结构 CPU是计算的核心,用于解析机器码和执行指令.CPU的数据处理能力非常快,但是(寄存器的)存储空间非常有限. 内存的数据传输速度适中(与CPU.硬盘比),存储空间适中: 硬盘数据传输速度慢,存储空间大. CPU可以(通过总线)直接操作内存,这样的能力体现在CPU指令上.实际上,计算机的绝大多数功能,都是通过CPU操作内存直接体现的. 其他的显示器.硬盘.打印机等是"外设". 因此,CPU如何定位

C零基础视频-47-C语言操作文件

目录 C语言文件操作函数 fopen:打开或创建文件 fopen中的mode参数 fclose:关闭文件 C语言文件操作函数 C标准库中提供了一系列的函数,来操作文件.因为C库函数做了这个中间层,屏蔽掉了操作系统上对于文件的不同处理. 关于文件的常见基本操作有: 打开文件:创建文件或打开文件载体(磁盘)中已有的文件 关闭文件:类似free,释放掉内存中与文件有关的动态资源 读取文件:数据由文件载体(磁盘)到内存 写入文件:数据由内存到文件载体(磁盘) fopen:打开或创建文件 fopen的原型

C零基础视频-48-文件的写入与读取

目录 fread与fwrite fread与fwrite 从信息的转换角度看,文件的读取与写入,其实就是信息在文件介质(磁盘)与内存之间进行转换. 文件读取(fread),就是将磁盘中的文件内容,读取进内存中:而文件写入(fwrite),就是将内存中的内容,写入到磁盘中. 那么他们就会面临几个关键问题: 数据在磁盘哪里? 数据在内存哪里? 有多少数据? 了解以上信息后,就不难理解fread与fwrite的函数原型: size_t fwrite( const void *buffer, size_

C零基础视频-27-字符串

目录 什么是字符串 C语言中的字符串 字符数组与字符串的比较 什么是字符串 之前我们已经学过单个字符的文字型数据(char).同时了解过字符串. 在C语言中,字符串用双引号包围. #include <stdio.h> int main(int argc, char* argv[]) { printf("Hello"); return 0; } 字符串不是C语言中的基本数据类型.在我们之后的学习中可以看到,它是根据约定存储多个char数据的一种方式. C语言中的字符串 为了方