C语言程序设计——结构体、枚举、联合

news2024/12/29 10:19:09

一、结构体

1. 概念

        结构体是一种自定义的数据类型,它是一些值的集合,这些值称为成员变量,结构体由多个数据成员组成,这些成员可以是不同类型的变量。

2. 结构体的声明

2.1 一般声明

struct student {
    char name[10];
    int age;
};

2.2 特殊声明

//匿名结构体类型
struct {
    char name[10];
    int age;
}s1,s2;

        匿名结构体类型,只能在声明结构体类型时,顺带创建其结构体变量,其余地方无法再创建该类型的变量。也就是只能使用一次。

注意:

        即使多个匿名结构体的成员完全一致,它们也属于不同的结构体类型。

3. 结构体的自引用

在结构体中包含一个类型为该结构体本身的成员是否可以?

struct ListNode {
	int val;
	struct ListNode next;
};

注意:这种自引用方式是不可以的,结构体的成员不能是自身类型,因为编译器无法确定结构体的大小。

正确的自引用方式:

struct ListNode {
	int val;
    //使用指针来保存自身类型成员的地址
	struct ListNode* next;
};

4. 结构体变量的定义和初始化

struct ListNode {
	int val;
	struct ListNode* next;
}n1, n2;//声明类型的同时定义变量n1,n2
//定义变量同时赋初始值
struct ListNode n3 = { 10, NULL };

5. 结构体内存对齐

5.1 结构体内存对齐规则★

(1)第一个成员在与结构体变量偏移量为0的地址处;

(2)其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;

        对齐数 = min(编译器默认对齐数, 该成员变量大小)

(3)结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍;

(4)如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

5.2 为什么存在内存对齐?

(1)平台原因

        不是所有平台的硬件都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取出某些特定类型的数据。

(2)性能原因

        数据结构(尤其是栈)应该尽可能的在自然边界上对齐;因为为了访问未对齐的内存,处理器需要两次内存访问,而对于对齐的内存访问只需要一次访问。

(3)总结

        本质是因为硬件平台限制,导致数据读取可能会出现低效率问题,通过“浪费”一些空间的方式,来达到快速读取目标数据的目的。

5.3 修改默认对齐数

#pragma pack(4)//修改默认对齐数为4
struct Node {
	char ch;
	int a;
	char cr;
};
#pragma pack(8)//修改默认对齐数为8

二、位段

1. 概念

        位段是C语言中的一个特性,用于在结构体中以位为单位定义和访问数据。它允许我们对结构体成员进行精确的位级别的控制,以节省内存空间。

(1)位段成员只能是整型类型(包括有符号和无符号整数类型)或枚举类型,不能使用浮点类型、结构体类型等非整型类型;

(2)位段的成员名后有一个冒号和数字。

struct A {
	int a : 2;//表示只需要2个bit
	int b : 5;
	int c : 10;
};

2. 位段的内存分配

(1)位段在空间上是按照需要以4字节或1字节的方式来开辟的;

(2)位段涉及很多不确定因素,是不支持平台的,若是注直可移植性的程序应该避免使用位段。

3. 位段的跨平台问题

(1)int位段被当成有符号数还是无符号数是不确定的;

(2)位段中最大位的数目不能确定(比如在16位机器中最大为16,32位机器最大为32);

(3)位段中的成员在内存中是从左向右分配,还是从右向左分配,标志尚未定义;

(4)当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余位时,是舍弃剩余位还是利用,这是不确定的。

4. 位段的应用

        多用于计算机网络中一些协议首部结构,比如:

 三、枚举

1. 枚举类型的定义

enum day {
	mon,  // 0
	tues, // 1
	wed,  // 2
	thur, // 3
	fri,  // 4
	sat,  // 5
	sun   // 6
};

        {}中的内容是枚举类型的可能取值,也叫枚举常量。取值默认从0开始,依次递增1,如果在定义的时候赋予了初始值,则后续在此基础上依次加一。

enum day {
	mon,  // 0
	tues = 2, // 2
	wed,  // 3
	thur, // 4
	fri = 8,  // 8
	sat,  // 9
	sun   // 10
};

2. 枚举的优点

(1)增加代码的可读性和可维护性;

(2)相比较于#define定义的标识符,枚举有类型检查,更加严谨;

(3)防止命名污染;

(4)便于调试;

(5)使用方便,一次可以定义多个常量。

四、联合(共用体)

1. 联合类型的定义

        联合是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特点是这些成员共用同一块空间,所以联合也叫共用体。

union re {
	int a;
	char ch;
};

2. 联合的特点

        联合的所有成员共用同一块内存空间,一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。

3. 联合大小计算

(1)联合大小至少是最大成员的大小;

(2)当最大成员大小不是最大对齐数的整数倍的时候,就需要对齐到最大对齐数的整数倍。

比如:

union {
	char arr[5];
	int i;
};

        该联合最大成员大小为5,最大对齐数是4,所以需要对齐到最大对齐数整数倍数,即该联合大小为8。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx系列之 一 反向代理

目录 Nginx系列之 一 入门_开着拖拉机回家的博客-CSDN博 一、Nginx概述 二、反向代理 2.1 正向代理 2.2 反向代理 三、反向代理实战 3.1测试服务器 3.2 配置文件说明 3.3 反向代理实战案例一 1、目的 2、具体实现 3.4 反向代理实战案例二 1、目的 2、具体实现 入…

力扣 860. 柠檬水找零

题目来源:https://leetcode.cn/problems/lemonade-change/description/ C题解:由于收到的钱币只有5,10,20三种,对于5元直接收,对于10元找零1张5元,对于20元找零15元,可以找零105或者…

java 使用 geotools 将 shp 文件(zip压缩包)转换为 geoJson 格式

步骤0:你也可以参考这篇文章 :java实现geojson格式数据与shp文件相互转换 步骤1:引入引入geotools工具。 步骤2:编写工具类,获取shp的zip文件。 步骤3:编写工具类,解析shp文件成为jsonObject…

6.7Jmeter5.1,非GUI模式,通过命令行传递线程数和运行时间

原创文章,谢绝转载。 一、前提 本次做性能测试,需求是需要在Linux下的非GUI模式下执行。但用命令行执行时,线程数需要改变,为了执行方便,不需要每次都在脚本中修改线程数,那么线程数都需要通过参数传递&…

如何使用自有数据微调ChatGLM-6B

构建自己的数据集 数据格式:问答对 官网例子 ADGEN 数据集任务为根据输入(content)生成一段广告词(summary)。 { "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖…

【雕爷学编程】Arduino动手做(22)——8X8 LED点阵MAX7219屏2

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这…

AI图像生成无需代码连接集简云数据表的方法

1 场景描述 人工智能的出现,各个领域都开始尝试将AI作为提高工作效率的必备工具。除了AI对话等,越来越多的AI图像生成工具也出现在市场上。这些AI图像生成工具可以自动创建惊人的图像、艺术作品和设计,从而帮助设计师和创意人员更快速地实现其…

下个月要备多少货?伙伴云零代码进销存系统让您一目了然

大量企业的商业模式是销售实体商品,他们需要进销存系统来帮助企业管理好采购、销售、仓储的业务流程,从而更高效稳定的获得利润,因此进销存是企业的核心业务场景。来看看伙伴云零代码进销存系统如何精准计算进货出货数量,让中小企…

unable to get local issuer certificate (_ssl.c:992)‘)]

操作系统mac os python 版本 python3.11 import edge_tts import asyncio TEXT "how are you"print(TEXT) voice zh-CN-YunxiNeural output 4.mp3 rate -4% volume 0% async def my_function():tts edge_tts.Communicate(text TEXT,voice voice,rate rate…

上海汽配IPO上会在即:由镇政府控股,募资还要偿还银行贷款?

近日,上海证券交易所披露的信息显示,上海汽车空调配件股份有限公司(以下简称“上海汽配”)将于7月21日接受上市委审议。据贝多财经了解,上海汽配已于7月13日更新了招股书(上会稿)。 本次冲刺IPO…

学Python编程为什么会对学好数学有帮助呢?

Python编程和数学有什么关系呢?Python的起源是怎样的呢? 我们先来简单认识一下Python,和Python交个朋友。 Python的全拼是P—Y—T—H—O—N,发音是Python,汉语解释是蟒蛇的意思。 我们再来看Python的图标&#xff0c…

STM32实现MLX90614非接触测温串口显示(标准库与HAL库实现)

目录 模块选择 编程环境 MLX90614基本原理 通信协议(SMBus通信,类IIC通信) 代码实现 STM32与模块之间接线表 1.标准库实现温度采集 2.HAL库实现温度采集 模块选择 STM32F103C8T6 MLX90614 非接触式红外测温传感器 编程环境 KEIL5&…

了解交换机接口的链路类型(access、trunk、hybrid)

上一个章节中讲到了vlan的作用及使用,这篇了解一下交换机接口的链路类型和什么情况下使用 vlan在数据包中是如何体现的,在上一篇的时候提到测试了一下,从PC1去访问PC4的时候,只从E0/0/2发送给了E0/0/3这是,因为两个接…

手把手GDB调试

确保你的程序有可调式的信息 使用gcc编译一个程序 ,带上一些额外的参数 -o0 -g-o0 :避免编译器优化,使用最低的优化等级,默认的编译选项 -g :生产调试信息 如果你已经有一个工程demo,使用cmake时注意使用Debug模式&…

Java使用poi-tl生成word文档添加超链接及添加多个超链接情况

首先是生成单个超链接情况,很简单 就是通过字符替换就行,但是替换的value格式是 TextRenderData data.put("attachment",Texts.of("文件名").link("http://wenjianlj文件路径.com").create()); 就是在替换的data&#…

spring复习:(39)注解方式的ProxyFactoryBean

一、定义接口 package cn.edu.tju.study.service;public interface MyService {void myMethod(); }二、定义实现类: package cn.edu.tju.study.service;public class MyServiceImpl implements MyService{Overridepublic void myMethod() {System.out.println(&qu…

认识一个失意的李白:如何制作一个人物生平二维码?

电影《长安三万里》的火爆,又一次唤醒了我们对大唐盛世的憧憬和向往。 飞流直下的瀑布、洒落床前的月光、花间独酌的美酒、胡天八月的大雪、越过青天的白鹭、长河孤烟的大漠、钟鼓馔玉的宴会……每每读起,那景象如在眼前。 对于一代又一代读着唐诗、听…

小程序一码跳多端的实现架构。。。

以常用的小程序,微信,支付宝为例, 现在要实现一个二维码,通过微信扫跳转微信小程序,通过支付包扫,跳转支付宝小程序,(其他小程序也如此) 实现思路,H5页面周转…

社区生鲜超市数字化经营怎么做?社区生鲜超市系统一览

社区生鲜超市是一种以货架自助的形式、结合现代超市经营理念,来售卖果蔬、肉类、水产、粮油、熟食等生鲜产品的一种零售形式,通常为小规模的连锁生鲜超市、专营店,主要服务于一个社区、街区等。目前,社区生鲜超市通常拥有较好的区…

【数据结构】二叉树详解(1)

⭐️ 前言 ✨ 二叉树的概念性质 ⭐️ 二叉树链式结构的实现 结构定义&#xff1a; #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int BinaryTreeDataType;typedef struct BinaryTreeNode {BinaryTreeDataType value;struct Binary…