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

yizhihongxing

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日

相关文章

  • C语言求解最长公共子字符串问题及相关的算法分析

    C语言求解最长公共子字符串问题及相关的算法分析 简介 在文本处理中,求解最长公共子字符串问题是一个普遍的、重要的问题。该问题描述如下:给定两个字符串s1和s2,求它们的最长公共子字符串,即在两个字符串中都出现过的最长的子串。 算法分析 在求解最长公共子字符串问题中,有多种不同的算法,这里介绍两种常用的算法:暴力枚举和动态规划。 暴力枚举算法 暴力枚举算法是最…

    C 2023年5月22日
    00
  • 网络基础版各种命令行集锦

    我来为你详细讲解一下“网络基础版各种命令行集锦”的攻略。 网络基础版各种命令行集锦 简介 在网络相关工作或学习中,命令行的使用是必不可少的一部分。本文以Linux系统为例,介绍一些常见的网络命令行操作,帮助读者更好地理解和掌握命令行的使用方法。 网络基础命令 ifconfig ifconfig命令用于配置和显示网络接口的信息。在终端中输入ifconfig后,…

    C 2023年5月22日
    00
  • C++中的类成员函数当线程函数

    C++中的线程库(std::thread)可以处理各种类型的函数作为线程函数,包括类的成员函数。对于类成员函数,我们需要考虑如何处理this指针,并注意线程的生命周期。 以下是将类成员函数作为线程函数的完整攻略: 步骤1:定义类 首先,需要定义一个含有成员函数的类。本例中,我们定义了一个简单的Counter类,它具有公共函数increment(),用于增加计…

    C 2023年5月22日
    00
  • C++中的extern “C”用法详解

    C++中的extern “C”用法详解 简介 在C++中,存在着C和C++的二进制兼容性问题,即C++编译后的函数名与C编译后的函数名不一样。这会导致当我们在头文件中声明一个C++函数的时候,在C语言中无法使用这个函数。所以我们需要在C++ 中使用 extern “C” 关键字声明特定函数,以便在 C++ 环境下使用 C 标准程序声明及定义的函数。 用法 使…

    C 2023年5月23日
    00
  • Python实现求解一元二次方程的方法示例

    当我们需要求解一元二次方程时,可以通过Python程序来实现。Python提供了强大的数学模块math,其中包含了求解一元二次方程的函数。本篇攻略将会详细讲解如何使用Python实现求解一元二次方程的方法。 一元二次方程的基本知识 我们先来回顾一下一元二次方程的基本知识。 一元二次方程的一般形式为: $$ax^2+bx+c=0$$ 其中,a, b, c均为实…

    C 2023年5月22日
    00
  • VSCode搭建C/C++编译环境的详细教程

    让我们来详细讲解一下“VSCode搭建C/C++编译环境的详细教程”,具体步骤如下: 1. 安装VSCode 下载并安装Visual Studio Code: https://code.visualstudio.com/ 2. 安装C/C++插件 在VSCode中点击菜单栏的“扩展”(Extensions)按钮,在搜索框中输入“C/C++”,找到官方提供的插…

    C 2023年5月23日
    00
  • C++实现简单版图书管理系统

    C++实现简单版图书管理系统攻略 本文将介绍如何使用C++语言实现简单版图书管理系统。本系统主要包含以下功能:添加图书信息、删除图书信息、查看图书信息、修改图书信息、退出系统。 设计思路 在开始实现之前,我们需要先确定程序的设计思路。将所有的操作封装成一个类,来实现图书的添加、删除、修改、查询等操作。同时,我们需要设计出一个图书类,包含图书的基本信息。 代码…

    C 2023年5月23日
    00
  • 深入解析C语言中常数的数据类型

    深入解析C语言中常数的数据类型 在C语言中,常数的数据类型也是十分重要的。正确理解常数的类型、范围和精度对于编写高质量的程序至关重要。在本文中,我们将深入探讨C语言中常数的数据类型,并提供两个示例以帮助理解。 整数常数 在C语言中,整数常数可以表示为十进制、八进制或十六进制形式。整数常数的类型(即有符号或无符号)和大小(即占用的位数)取决于它的值和后缀。 举…

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