C语言 结构体和联合体的区别

C语言 结构体和联合体的区别

什么是结构体

在 C 语言中,结构体是一种自定义数据类型,它允许程序员将不同类型的变量组合在一起,形成一个数据集合。结构体是由一组多个变量组成的新的数据类型,在定义结构体时,需要定义这个结构体包含的成员变量的类型和名称。

通常定义结构体的方式为:

struct 结构体名称{
    成员变量1;
    成员变量2;
    ...........
    成员变量n;
};

其中,结构体名称是自定义的,可以是任意合法的标识符,成员变量是由数据类型和标识符组成的。

例如,定义一个存储学生信息的结构体:

struct Students{
    char name[20];
    int age;
    char gender;
    char address[50];
};

在这个结构体中,我们定义了四个成员变量,分别是学生姓名、学生年龄、学生性别、学生地址。

定义了结构体之后,我们可以通过结构体的名称来声明变量,也可以通过"."运算符来访问结构体的成员变量,例如:

struct Students stu;  // 声明了一个名为stu的学生信息结构体变量

strcpy(stu.name, "Tom");  // 向变量stu中的name成员变量中赋值为"Tom"
stu.age = 18;  // 向变量stu中的age成员变量中赋值为18
stu.gender = 'M';  // 向变量stu中的gender成员变量中赋值为'M'
strcpy(stu.address, "No.123, Xinyuan Street, Haidian District, Beijing");  // 向变量stu中的address成员变量中赋值为"No.123, Xinyuan Street, Haidian District, Beijing"

什么是联合体

在 C 语言中,联合体是一种特殊的结构体。不同的是,联合体中的成员变量共享同一内存区域,即联合体中的所有成员变量占用的是同一块内存空间。因此,联合体的各个成员只能是同一种数据类型,这些成员只有一个可以被激活。

通常定义联合体的方式为:

union 联合体名称{
    成员变量1;
    成员变量2;
    ...........
    成员变量n;
};

和结构体一样,联合体中的成员变量是由数据类型和标识符组成的。定义联合体之后,我们可以通过联合体的名称来声明变量,也可以通过"."运算符来访问联合体的成员变量。

例如,定义一个联合体:

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

在这个联合体中,我们定义了三个成员变量,分别是一个整型变量、一个浮点型变量和一个字符串变量。

我们可以通过联合体来存储一个整型、浮点型或字符串类型的数据,但是在同一时间内,联合体中只能有一个成员变量被激活,即只能存储其中的一种数据类型。例如:

union Data data;
data.i = 10;
printf( "data.i : %d\n", data.i);

data.f = 220.5;
printf( "data.f : %f\n", data.f);

strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str);

在这个示例中,我们定义了一个联合体data,并依次往其中赋值一个整型、一个浮点型和一个字符串变量。但需要注意的是,每次变量被赋值之后,其他的成员变量会被自动更新为新值,因为每个成员变量都共享同一块内存空间。

区别

结构体和联合体之间的主要区别在于:

  1. 结构体的不同成员变量占用不同的内存空间,而联合体的不同成员变量共享同一块内存空间;
  2. 结构体中的多个成员变量可以同时被使用,而联合体中只能有一个成员变量被激活。

对于不同的应用场景,我们需要选择适合的数据类型来存储数据。如果需要存储多种不同类型的数据,可以使用结构体。如果需要只存储其中一种数据类型,并且在不同的时间段中需要存储不同类型的数据,可以使用联合体。

例子

示例1:一个学生信息的结构体程序

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

struct student{
    char name[20];
    int age;
    char gender;
    char address[50];
};

int main()
{
    struct student stu; // 定义结构体变量stu,用于存储学生信息
    printf("请输入学生姓名:");
    scanf("%s", stu.name);
    printf("请输入学生年龄:");
    scanf("%d", &stu.age);
    printf("请输入学生性别:");
    scanf(" %c", &stu.gender);
    printf("请输入学生地址:");
    scanf("%s", stu.address);

    printf("\n学生信息如下:\n");
    printf("姓名:%s\n", stu.name);
    printf("年龄:%d\n", stu.age);
    printf("性别:%c\n", stu.gender);
    printf("地址:%s\n", stu.address);

    return 0;
}

这个程序通过一个学生信息的结构体来存储学生的姓名、年龄、性别和地址信息,用户可以输入这些信息,程序将其存储起来并输出。

示例2:一个简单的计算器程序

#include <stdio.h>

union calc{
    int num;
    char op;
};

int main()
{
    char operator;
    int num1, num2, result;
    union calc value;
    printf("请输入运算符(+, -, *, / ):");
    scanf("%c", &operator);
    printf("请输入两个数字:");

    scanf("%d", &num1);
    scanf("%d", &num2);

    value.num = num1;
    switch(operator){
        case '+':
            value.num += num2;
            break;
        case '-':
            value.num -= num2;
            break;
        case '*':
            value.num *= num2;
            break;
        case '/':
            value.num /= num2;
            break;
        default:
            printf("错误的运算符\n");
            return 1;
    }

    printf("运算结果:%d\n", value.num);

    return 0;
}

这个程序通过一个简单的联合体来实现加、减、乘、除四种运算。用户输入指定的运算符和两个数字,程序通过算法计算出结果,并输出。在这个程序中,我们使用了联合体来存储两个数字和一个运算符,根据不同的运算符,选择联合体中的不同成员变量来完成运算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 结构体和联合体的区别 - Python技术站

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

相关文章

  • VC实现Windows多显示器编程的方法

    下面是详细的讲解“VC实现Windows多显示器编程的方法”的完整攻略。 1. 概述 在现代计算机上使用多个显示器已经很常见了,其中在Windows操作系统下实现多显示器编程对于一些需要展示多个窗口或图形界面的应用非常有用处。本文将介绍在VC环境下如何实现Windows多显示器编程。 2. 实现 2.1 函数EnumDisplayDevices 在Windo…

    C 2023年5月23日
    00
  • C语言程序设计

    第一章程序设计与C语言 1,机器语言属于第一代计算机语言,能直接识别和接受的二进制代码称为机器指令,用机器语言编写的程序程序称为目标程序,将高级语言编写的程序称为源程序,将源程序翻译成目标程序的程序称为编译程序。 2,软件危机:软件的正确性、开发成本、有错误而不能使用等。 3,对象是数据以及对数据进行简单的操作的封装体,程序设计语言的功能:数据表达和数据处理…

    C语言 2023年4月18日
    00
  • C#使用LitJson解析JSON的示例代码

    首先我们需要了解什么是JSON和LitJson,JSON是一种轻量级的数据交换格式,而LitJson则是一款C#的JSON序列化和反序列化库。 接下来,我们将用LitJson来解析JSON数据。以下是示例代码: 引用LitJson 在项目中引入LitJson.dll并添加LitJson命名空间 using LitJson; 创建一个类来接收JSON数据 在此…

    C 2023年5月23日
    00
  • JS仿Base.js实现的继承示例

    JS仿Base.js实现的继承示例是一种通过原型链实现的继承方式,可以为程序员提供更加灵活的代码组织方式和更加高效的代码复用功能。以下是详细的攻略过程: 1. 前置知识 在学习JS仿Base.js实现的继承示例前,需要掌握以下前置知识:- JS的原型和原型链- JS中函数的this指向- JS中的作用域和闭包- JS的面向对象编程思想 2. 示例说明 接下来…

    C 2023年5月22日
    00
  • C++11 智能指针之shared_ptr代码详解

    对于“C++11 智能指针之shared_ptr代码详解”的攻略,可以分为以下几个部分: 1. 什么是智能指针 智能指针是一种可以自动管理内存的指针,能够避免常见的内存泄漏问题。在C++11标准之前,C++只提供了裸指针,即没有自动内存管理功能的指针。通过引入智能指针,可以减少程序中常见的内存泄漏问题,提高程序的健壮性。 2. shared_ptr的使用 s…

    C 2023年5月22日
    00
  • 一般故障排除步骤与方法

    一般故障排除步骤与方法是指在出现问题时,根据既定的步骤和方法,对系统进行排查、诊断和修复。以下是一般故障排除步骤与方法的完整攻略: 1.确认问题 提供详细信息,例如发生时间、出现的错误提示信息、是否有日志记录等。 尝试重复问题并确定是否一致。 确定问题的严重程度和影响范围。 2.收集信息 查看系统文件(日志文件、配置文件等)以及系统状态(CPU、内存)。 确…

    C 2023年5月24日
    00
  • C语言中如何进行代码保护?

    在C语言中,代码保护是指采取一系列措施,防止不合法的访问和修改程序,以提高程序的安全性和可靠性。下面是C语言中进行代码保护的一些常用方法: 1.使用共享库 将程序中一些常见的函数封装成共享库,能够有效地避免代码被恶意篡改的问题,同时还可以使程序占用更少的内存空间。在Linux下,使用共享库非常方便,只需要将程序中用到的函数的原型声明在头文件中,然后将共享库链…

    C 2023年4月27日
    00
  • Visual Studio Code 配置C、C++ 文件debug调试环境的详细过程

    下面是Visual Studio Code配置C/C++文件debug调试环境的详细过程: 安装必要的软件 在开始配置之前,需要先安装以下软件: Visual Studio Code:用于代码编辑和调试 MinGW:用于编译C/C++代码 C/C++插件:用于在Visual Studio Code中编写C/C++代码 配置调试环境 打开Visual Stud…

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