首页 > 其他分享 >C语言:结构体和共用体

C语言:结构体和共用体

时间:2024-05-28 16:01:55浏览次数:21  
标签:成员 C语言 访问 内存 共用 data example 结构

一.简述

结构体和共用体是C语言中两种重要的用户自定义数据类型,用于将不同类型的数据组合在一起。它们在内存布局、用途和访问方式上都有显著的区别和一些相似点。以下是详细的介绍:

Ⅰ结构体

定义

struct Example {

    int a;

    float b;

    char c;

};

①内存布局

结构体中的每个成员都有自己的内存空间,且各成员在内存中是按顺序排列的。每个成员都有自己的地址,结构体的总大小是所有成员大小的总和(可能加上一些填充字节以满足内存对齐要求)。

②使用场景

结构体适用于需要将多种类型的数据组合在一起并且需要同时访问它们的场景。例如,在表示一个点(有x和y坐标)或一个学生的信息(有名字、年龄、成绩等)时,可以使用结构体。

③访问方式

通过结构体变量和成员名访问结构体中的成员。例如:

struct Example example;

example.a = 10;

example.b = 20.5;

example.c = 'c';

Ⅱ共用体

定义

union Example {

    int a;

    float b;

    char c;

};

①内存布局

共用体中的所有成员共享同一段内存。这意味着在任一时刻,只有一个成员能有效地存储数据。共用体的总大小是其最大成员的大小。

②使用场景

共用体适用于节省内存的场景,尤其是当需要在不同时间存储不同类型的数据时。例如,在处理多个数据类型但同时只需要一个有效的值时,可以使用共用体。

③访问方式

通过共用体变量和成员名访问共用体中的成员。例如:

union Example example;

example.a = 10; // 使用example.a

example.b = 20.5; // 此时example.a的值将不再有效,因为它们共享同一段内存

二.异同总结

①相似点

语法:两者的定义和成员访问方式类似。

用途:都用于将不同类型的数据组合在一起。

②不同点

(1)内存分配:

结构体:每个成员有独立的内存空间,总大小是所有成员大小之和。

共用体:所有成员共享同一段内存,总大小是最大成员的大小。

(2)访问方式:

结构体:可以同时访问所有成员。

共用体:在任一时刻只能有效访问一个成员,访问其他成员会导致未定义行为。

(3)数据有效性:

结构体:所有成员的数据始终有效且互不影响。

共用体:每次只能有效存储一个成员的数据,写入一个成员会覆盖其他成员的数据。

(4)用途:

结构体:用于逻辑上相关的多种数据类型的组合,且需要同时访问这些数据。

共用体:用于节省内存或在不同时间段存储不同类型的数据。

三.示例

①结构体示例:

#include <stdio.h>

struct Point {

    int x;

    int y;

};

int main() {

    struct Point p;

    p.x = 10;

    p.y = 20;

    printf("Point coordinates: (%d, %d)\n", p.x, p.y);

    return 0;

}

②共用体示例:

#include <stdio.h>

union Data {

    int i;

    float f;

    char str[20];

};

int main() {

    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);

    return 0;

}

(注:代码中,虽然使用了共用体,但代码未能展示共用体在任一时刻只能有效访问一个成员的特性。这是因为每次给一个成员赋值后,立刻打印它的值,然后再给另一个成员赋值。这种情况下,每次打印的都是刚赋值的成员,所以没有展示出覆盖问题。)

通过以上的介绍和示例,可以清晰地看到结构体和共用体在定义、内存布局、使用场景和访问方式上的异同。

标签:成员,C语言,访问,内存,共用,data,example,结构
From: https://blog.csdn.net/omit250/article/details/139235025

相关文章

  • 一次spring boot干净结构设计纪录
    前言其实以前对于java写出来的代码还是颇有微辞,特别是当写http服务的时候,写出来的代码难免有许多重复编写却又不得不写的代码,并且一些代码少了一些spring的味道,比如结果处理、日志纪录等,即使说得再明白,每一位同事写出来的都多多少少会偏离,失败和异常的界限很多时候......
  • 数据结构的直接插入排序(C语言版)
    一.直接插入排序的基本概念1.直接插入排序的基本思想将数组分为已排序和未排序两部分。每次从未排序部分取出一个元素,将其插入到已排序部分的合适位置,使得已排序部分保持有序。重复步骤2,直到整个数组有序。2.排序的工作原理假设前i-1个元素已经有序,现在要将......
  • 数据结构:队列
    目录队列的概念和结构队列的实现结构定义初始化判空入队列出队列返回队头元素返回队尾元素返回size销毁 队列的概念和结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)入队列:进行插入操......
  • 枚举(C语言)
    1.枚举定义枚举是C语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。定义一个枚举类型,需要使用 enum 关键字,后面跟着枚举类型的名称,以及用大括号 {} ......
  • 数据结构--哈夫曼树
    一、实验目的1、掌握二叉树的逻辑结构、存储结构及基本操作;2、熟练掌握哈夫曼树在实际问题中的应用;3、针对计算机领域复杂工程问题,能够综合运用数据结构的基本理论和设计方法,设计出合理的算法。二、实验内容 “烽火连三月,家书抵万金”可见古人传递信息的不容易。古人用烽......
  • LLM 大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解
    LLM大模型学习必知必会系列(四):LLM训练理论篇以及Transformer结构模型详解1.模型/训练/推理知识介绍深度学习领域所谓的“模型”,是一个复杂的数学公式构成的计算步骤。为了便于理解,我们以一元一次方程为例子解释:y=ax+b该方程意味着给出常数a、b后,可以通过给出的x求出......
  • C语言---指针
    概念:指针就是指地址,指针是一种数据类型,专门用来存储地址这种数据的数据类型。指针变量的定义:基类型*变量名;eg:inta=10;int*p=&a;*p运算:1、首先拿出p中地址,到内存中定位2、定位到之后,从定位处开始,偏移出sizeof(基类型)的一块空间3、将这块空间当作一个基类......
  • 【C语言】10.C语言指针(2)
    文章目录1.数组名的理解2.使用指针访问数组3.一维数组传参的本质4.冒泡排序算法步骤5.二级指针6.指针数组7.指针数组模拟二维数组1.数组名的理解intarr[10]={1,2,3,4,5,6,7,8,9,10};int*p=&arr[0];这里我们使用&arr[0]的方式拿到了数组第一个元素的地......
  • golang为什么chan大部分是发送结构体,而不是其它比如string
     typetokenstruct{}typeGroupstruct{cancelfunc(error)wgsync.WaitGroupsemchantokenerrOncesync.Onceerrerror}func(g*Group)done(){ifg.sem!=nil{<-g.sem}g.wg.Done()}在Go语言中,通道(......
  • 初识C语言——第二十九天
    数组本章重点1.一维数组的创建和初始化数组的创建注意事项:1.一维由低数组在内存中是连续存放的!2.随着数组下标的增长,地址是由低到高变化的2.二维数组的创建和初始化注意事项:1.二维数组在内存中也是连续存放的(一行内部是连续的,跨行也是连续的)#define_CR......