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

C语言

文章目录


前言

一、什么是结构体

在C语言中,结构体指的是一种数据结构,是C语言中聚合数据类型的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。也就是说,结构体是由多种元素所构成的数据结构。

c 复制代码
struct 结构体
{    
   任意类型 任意变量; 
   任意类型 任意变量;    
   ......
 };

注意:这不是定义变量,而是自定义一种类型而已。如:

c 复制代码
struct student
{
char name[10];//学生姓名
int height;//学生身高
bool sex;//学生性别 假设0表示女,1表示男。
};

类型定义好以后,则可以定义该类型的变量

c 复制代码
struct student a,b;// struct可以省略。
可以在定义结构体变量的时候赋值。如
student a={"q",172,1},b={"x",172,1};

也可以在定义结构体变量以后赋值,但注意不能再用{}。如:

c 复制代码
student a,b;a={"q",172,1},b={"x",172,1};//这是错误的。

应该是

c 复制代码
a.name="q";
a.height=172;
a.sex=1;

可以在定义结构体类型的时候同时定义结构体变量并赋值。

c 复制代码
struct student
{  
char name[10];//学生姓名  
int height;//学生身高  
bool sex;//学生性别 假设0表示女,1表示男。
} a={"q",172,1},b={"x",172,1};

访问结构体成员要用直接成员运算符"."或间接成员运算符"->"。

对于结构体变量,访问其中的成员采取"结构体变量.成员"的形式;而对于结构体指针,访问它所指向的结构体变量中的成员,则采取"结构体指针->成员"形式。

c 复制代码
#include <stdio.h>

// 定义一个结构体类型
typedef struct {
    int age;
    float height;
} Person;

int main() {
    // 定义一个结构体变量
    Person person1;
    
    // 定义一个结构体指针
    Person *person2;

    // 为结构体变量赋值
    person1.age = 25;
    person1.height = 175.5;

    // 为结构体指针分配内存并赋值
    person2 = (Person *)malloc(sizeof(Person));
    if (person2 == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }
    person2->age = 30;
    person2->height = 180.0;

    // 通过结构体变量访问成员
    printf("Person1 Age: %d\n", person1.age);
    printf("Person1 Height: %.2f\n", person1.height);

    // 通过结构体指针访问成员
    printf("Person2 Age: %d\n", person2->age);
    printf("Person2 Height: %.2f\n", person2->height);

    // 释放分配的内存
    free(person2);

    return 0;
}

二、什么是联合体

联合体也是一种自定义的复合类型,它可以包含多个不同类型的变量。这些变量在内存当中共用一段空间。这段空间的size就是各变量中size最大的那个变量。

c 复制代码
union myunion
{
  int num1;  
  double num2;  
  float num3;
 };

定义了一个联合体类型myunion。

myunion a,b;//定义了两个myunion型变量。也可以在定义联合体类型的时候定义联合体变量。如:

c 复制代码
union myunion
{  
int num1; 
double num2; 
float num3;
  }a,b;

a占用的空间有多大呢?Sizeof(a)结果为8,即myunion占用8个字节,和double型变量相同。

注意:任一时刻,只能访问结构体里面的一个变量。

联合体(Union)与结构体相似,但它们的区别在于联合体中只能同时存储一个成员的值。这些成员共享同一个物理存储空间,也就是说,一个联合体的大小,等于它最大的成员变量所占据的空间。

c 复制代码
#include <stdio.h>

// 定义一个联合体类型
typedef union {
    int i;
    float f;
    char c;
} Data;

int main() {
    // 创建一个联合体变量
    Data data;

    // 向联合体的 int 成员赋值
    data.i = 10;
    printf("Data.i = %d\n", data.i);

    // 向联合体的 float 成员赋值
    data.f = 3.14;
    // 注意,这会覆盖之前存储在 i 中的值
    printf("Data.f = %.2f\n", data.f);

    // 向联合体的 char 成员赋值
    data.c = 'A';
    // 注意,这会覆盖之前存储在 f 中的值
    printf("Data.c = %c\n", data.c);

    // 打印联合体的大小
    printf("Size of union Data = %zu bytes\n", sizeof(data));

    return 0;
}

三、结构体和联合体的区别

1.结构体与联合体虽然都是由多个不同的数据类型成员组成的,但不同之处在于联合体中所有成员共用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,其所有成员都存在,不同成员会存放在不同的地址。在计算一个结构型变量的总长度时,其内存空间大小等于所有成员长度之和(需要考虑字节对齐),而在联合体中,所有成员不能同时占用内存空间,它们不能同时存在,所以一个联合型变量的长度等于其最长的成员的长度。

2.对于联合体的不同成员赋值,将会对它的其他成员重写,原来成员的值就不存在了,而对结构体的不同成员赋值是互不影响的。

相关推荐
fouryears_2341734 分钟前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~1 小时前
C#---StopWatch类
开发语言·c#
lifallen2 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研2 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO4 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试4 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑5 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_025 小时前
【Java基础面试题】Java基础概念
java·开发语言
Cx330❀6 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
杜子不疼.6 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习