C 共用体

C语言共用体(Union)完整使用攻略

共用体(Union)是C语言中一种特殊的数据类型,与结构体(Struct)类似,也是一种复合类型。共用体允许不同的数据类型在相同的内存空间里互相转换使用,这意味着在同一时间只能保存相同的数据类型,但可以在不同的时间存储不同的数据类型。

创建共用体

共用体和结构体的方式非常相似,可以使用关键字union来定义共用体,例如:

union Data {
   int i;
   float f;
   char str[20];
} variable;

这里定义了一个名为Data的共用体,它包含了相同的内存空间用于存储一个整数、一个浮点数以及一个字符串类型的字符数组。定义后,可以声明共用体变量:

union Data {
   int i;
   float f;
   char str[20];
} variable;

int main() {
    variable.i = 10; // i的值被设置为10
    printf("variable.i 的值: %d\n", variable.i);

    variable.f = 3.14; // 把浮点数值赋给变量f
    printf("variable.f 的值: %.2f\n", variable.f);

    strcpy(variable.str, "Hello World!"); // 把字符串赋给变量str
    printf("variable.str 的值: %s\n", variable.str);

    return 0;
}

运行结果:

variable.i 的值: 10
variable.f 的值: 3.14
variable.str 的值: Hello World!

可以看到,不同类型的数据存储在同一个内存空间内,并依次进行访问。

访问共用体的成员

共用体的成员可以像访问结构体成员一样访问,使用点运算符访问共用体成员,例如:

union Data {
   int i;
   float f;
   char str[20];
} variable;

int main() {
    variable.i = 10;
    printf("variable.i 的值: %d\n", variable.i);

    variable.f = 3.14;
    printf("variable.f 的值: %.2f\n", variable.f);

    strcpy(variable.str, "Hello World!");
    printf("variable.str 的值: %s\n", variable.str);

    printf("%lu\n", sizeof(variable)); // 打印共用体variable的大小

    return 0;
}

运行结果:

variable.i 的值: 10
variable.f 的值: 3.14
variable.str 的值: Hello World!
20

可以看到,所有成员共用一个内存空间,它们的地址是相同的。由于共用体的大小等于最大成员的大小,所以共用体的大小为20字节(4字节的整数。4字节的浮点数和20字节长度的字符串中最大的是20,因此共用体的大小是20字节)。

共用体的实际应用场景

共用体可以在编写需要相对较少的代码和内存的程序时非常有用,因为它们允许你以多种方式引用相同的内存位置。以下是两个使用共用体的实例:

示例一

假设有一个具有两个字段的结构,其中“类型”(int)字段是0时是邮政编码,而“类型”(int)字段是1时是移动电话号码。可以使用共用体来定义该结构,如下所示:

union Contact {
    int zip_code;
    int phone_number;
};

struct Person {
    char name[64];
    union Contact contact;
    int contact_type;
};

int main () {
    struct Person p;
    strcpy(p.name, "John");
    p.contact_type = 0;
    p.contact.zip_code = 518057;
    printf("Name: %s\n", p.name);
    printf("Zip Code: %d\n", p.contact.zip_code); // 只有在contact_type为0时,zip_code的值才是有效的
    // p.contact.phone_number = "1234567890"; 当contact_type为1时使用phone_number
    return 0;
}

运行结果:

Name: John
Zip Code: 518057

示例二

共用体也可以用来在不同的数据类型之间转换:

union Converter {
    float f;
    int i;
};

int main() {
    union Converter c;
    c.f = 3.14;
    printf("浮点数 f = %f\n", c.f);
    printf("整数 i = %d\n", c.i);
    c.i = 1234;
    printf("浮点数 f = %f\n", c.f);
    printf("整数 i = %d\n", c.i);
    return 0;
}

运行结果:

浮点数 f = 3.140000
整数 i = 1078523331
浮点数 f = 1234.000000
整数 i = 1234

在以上示例中,共用体用于将同一内存位置中的浮点数和整数相互转换,这种类型的操作对于底层的数据结构操作非常有用,例如:htonlntohl函数就是用于将大端和小端字节序之间转换整数。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 共用体 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C语言实现大学生考勤管理系统

    C语言实现大学生考勤管理系统攻略 1. 确认需求 在开始开发大学生考勤管理系统之前,我们需要明确该系统的需求和功能。简单列举出以下几个方面: 学生信息录入功能 签到功能 课程信息管理功能 学生考勤数据统计分析 系统管理员的权限控制 2. 创建数据表 在开发大学生考勤管理系统之前,我们需要创建数据库以存储学生信息和考勤数据。我们可以使用 MySQL 等关系型数…

    C 2023年5月23日
    00
  • C语言中system()执行cmd命令打开关闭程序的方法

    下面是详细讲解“C语言中system()执行cmd命令打开关闭程序的方法”的完整攻略: 1. system()函数简介 在C语言中,system()函数是一个非常强大的函数,它可以让我们执行许多操作系统命令,包括打开和关闭程序。下面是system()函数的定义: #include <stdlib.h> int system(const char …

    C 2023年5月23日
    00
  • C语言局部数据指针

    当我们在写C语言程序时,经常会定义一些变量,这些变量可以是全局变量,也可以是局部变量。而局部变量是指定义在函数内部或代码块内部的变量,这些变量的作用域仅限于定义它们的函数或代码块内部。那么在定义局部变量时,我们可以定义一个指针变量,它可以指向局部变量的地址。这就是C语言局部数据指针的使用方法。 如下是C语言局部数据指针的使用攻略: 1. 定义局部变量和指针变…

    C 2023年5月9日
    00
  • C++实现路口交通灯模拟系统

    C++实现路口交通灯模拟系统完整攻略 介绍 本系统利用C++语言实现,模拟了路口交通灯的控制,包括车辆的停止和通行,交通信号的改变等。系统结构清晰,代码简单易懂,适合初学者学习C++语言的基础和面向对象编程的实现。 设计思路 本系统的设计思路涉及到面向对象编程的基本思想。首先将路口、红绿灯、车辆等实体抽象为类,通过类的成员函数实现对对象的控制。同时,本系统利…

    C 2023年5月23日
    00
  • Android编程之json解析实例详解

    我将为你介绍一下 “Android编程之json解析实例详解” 的完整攻略。 1. 什么是Json? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript代码语法,但是与之无关。在Android编程中,Json数据常常被用来传递数据。 2. Json的基本格式 下面是一个Json的基本格式: …

    C 2023年5月23日
    00
  • win11系统快捷键大全 附详细功能介绍

    下面是针对“win11系统快捷键大全 附详细功能介绍”的完整攻略: Win11系统快捷键大全 基础快捷键 Win键:打开/关闭“开始”菜单 Win+D:显示/隐藏桌面 Win+E:打开资源管理器 Win+L:锁定计算机 Win+S:打开搜索面板 Ctrl+C:复制所选内容 Ctrl+V:粘贴上复制的内容 Ctrl+A:选中所有内容 Ctrl+Z:撤销上一页操…

    C 2023年5月23日
    00
  • vue中ts无法识别引入的vue文件,提示找不到xxx.vue模块的解决

    在Vue项目中使用TypeScript,当我们通过import导入.vue文件时,TS可能会抱怨找不到模块。这是因为TypeScript没有为.vue文件定义类型声明。为了解决这个问题,需要安装”vue-class-component”和”vue-property-decorator”两个库,并对tsconfig.json文件进行一些配置。 以下是具体步骤:…

    C 2023年5月23日
    00
  • C++语言基础 命名空间

    C++是一门支持命名空间的语言,命名空间是C++中避免命名冲突的一个重要方式。我们可以通过使用命名空间,把定义在不同范围内的标识符分开,从而保证程序中的标识符不会冲突。 在C++中,命名空间是用关键字“namespace”来定义,如下所示: namespace MyNamespace { // 声明和定义各种变量、函数、类等成员 } 这里的“MyNamesp…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部