C语言(结构体,联合体,枚举的讲解)

这期我们来讲解结构体,联合体,以及枚举的讲解,首先我们从概念开始一步一步的了解。

1,结构体

1.1概念

C 语言中的结构体是一种用户自定义的数据类型,它允许你将不同类型的变量组合在一起,从而形成一个新的数据类型。结构体在 C 语言中非常有用,可以用于表示复杂的数据结构,比如学生信息、员工记录、图形对象等。

定义结构体的基本语法如下:c
struct 结构体名 {数据类型 成员1;数据类型 成员2;// 更多成员...
};
在这里,struct 是关键字,后面跟着的是结构体的名称,
紧接着是由大括号括起来的成员列表。
每个成员都有其自己的数据类型,可以是基本类型(如整型、浮点型、字符型等),
也可以是其他的结构体类型。

1.2代码实现

很简单吧,我们先来试一下

1.3结构体内存对齐

什么是内存存对齐,为什么结构体会存在内存对齐,内存对齐的规则是什么,,反正也不会告诉你。

在 C 语言中,结构体内存对齐是指编译器在分配内存时,为了提高访问效率而进行的一种内存布局优化。结构体的内存对齐是由编译器来决定的,它遵循特定的对齐规则,以确保结构体成员的访问具有最佳的性能。

在大多数情况下,编译器会根据平台的要求和 CPU 架构的特性来进行内存对齐。常见的内存对齐规则如下:

1.成员变量的偏移量必须是其大小的整数倍。

2.结构体的大小必须是其最大成员大小的整数倍。

根据内存对齐规则,编译器会进行内存对齐,可能导致结构体的大小不等于其成员变量大小之和。这是因为编译器会在适当的位置插入填充字节,以确保结构体成员按照对齐要求排列,从而提高访问效率。

具体的对齐规则可能会因编译器和平台而异,你可以使用 sizeof 运算符来获取结构体的大小,以便更好地理解编译器对结构体内存布局所做的优化。

当然我们也可以通过设置偏移量来改变其大小

2,联合体

2.1概念

在 C 语言中,联合体(union)是一种特殊的数据结构,它允许在同一个内存位置存储不同类型的数据。与结构体不同的是,联合体中的各个成员共享同一块内存空间,因此联合体的大小由最大的成员决定。

2.2代码实现

3,枚举

3.1概念

在 C 语言中,枚举(enum)是一种用户定义的数据类型,用于定义一组具名的整型常量。枚举类型可以帮助提高代码的可读性,使程序员能够使用有意义的符号名称来表示特定的值。

3.2代码实现

3.3define和枚举对比

很多初学C语言的小伙伴觉得枚举很鸡肋,用define就能实现的事情干嘛要用枚举。

枚举的优点:

  1. 类型安全性:枚举提供了类型安全,因为枚举常量属于特定的枚举类型,在赋值和比较时具有类型信息。
  2. 可读性:枚举符号名可以使代码更加易读和清晰,因为它们提供了有意义的名称来表示常量值。
  3. 编译时检查:由于枚举常量在编译时被解析,因此编译器可以对其进行检查,避免拼写错误或值的误用。

宏定义的优点:

  1. 灵活性:宏定义可以定义更复杂的常量,如带参数的宏、条件编译等,具有更大的灵活性。
  2. 无类型约束:宏定义不受类型限制,可以用于定义任何类型的常量,包括字符串、表达式等。

如何选择:

  • 当需要一组相关的常量,并且这些常量属于同一逻辑实体时,通常使用枚举更为合适。
  • 当需要定义简单的常量或进行代码替换时,宏定义可能更加适用。

总的来说,枚举提供了更好的可读性和类型安全性,而宏定义则更加灵活。

存在就有道理第

4,每期一问

上期答案:如何写出自己的atoi函数

#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>
enum State
{VAILD,INVAILD
}Sta = INVAILD;//创造变量默认为非法int my_atoi(const char* str)
{assert(str);if (*str == '\0'){return 0;}while (isspace(*str)){str++;}int flag = 1;if (*str == '+'){flag = 1;str++;}else if (*str == '-'){flag = -1;str++;}long long ret = 0;while (*str != '\0'){if (isdigit(*str)){ret = ret * 10 + flag * (*str - '0');//减去字符0,才是数字0if (ret > INT_MAX || ret < INT_MIN){return 0;}}else{return (int)ret;//强制类型转化为int(函数的返回值是int)}str++;}if (*str == '\0'){Sta = VAILD; //正常转换完了,到末尾的 \0}return (int)ret;

这期的问题是:使用malloc函数模拟开辟一个3*5的整型二维数组,开辟好后,使用二维数组的下标访问形式,访问空间。

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

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

相关文章

HBase常用的Filter过滤器操作

HBase过滤器种类很多&#xff0c;我们选择8种常用的过滤器进行介绍。为了获得更好的示例效果&#xff0c;先利用HBase Shell新建students表格&#xff0c;并往表格中进行写入多行数据。 一、数据准备工作 &#xff08;1&#xff09;在默认命名空间中新建表格students&#xf…

flask_restful规范返回值

使用方法 导入 flask_restful.marshal_with 装饰器 定义一个字典变量来指定需要返回的标准化字段&#xff0c;以及该字段的数据类型 在请求方法中&#xff0c;返回自定义对象的时候&#xff0c; flask_restful 会自动的读 取对象模型上的所有属性。 组装成一个符合标准化参…

AAPT: error: resource android:attr/dialogCornerRadius not found.

ERROR:D:\android.gradle\caches\transforms-3\b3b98118f65da38d0ad9da84cfc70a72\transformed\appcompat-1.0.0\res\values-v28\values-v28.xml:5:5-8:13: AAPT: error: resource android:attr/dialogCornerRadius not found. 请帮我看看这个错误是什么意思。我改如何做。 这个…

Linux环境基础开发工具使用——yum and vim

本篇将会介绍平时在Linux中开发常用到的一些工具&#xff0c;其中包括&#xff1a;软件包管理器 — yum&#xff0c;Liunx中的开发工具。具体的介绍了 yum 的相关操作以及 yum 源&#xff0c;同时还介绍了 windows与虚拟机如何进行的关联。然后对Liunx中的开发工具进行了详细的…

前端学习-CSS基础-Day1

一、CSS简介 1.1HTML局限性 只关注内容的语义&#xff0c;可以做简单的样式但是很臃肿且繁琐 1.2CSS优势 CSS层叠样式表&#xff0c;标记语言 设置HTML页面中的文本内容&#xff0c;图片外形&#xff0c;可以美化HTML&#xff0c;让页面布局更美观 HTML做框架&#xff0c;CSS做…

2020-Structure Aware Negative Sampling in Knowledge Graphs

摘要 使用对比估计学习知识图中实体和关系的低维表示是一种可扩展且有效的推断连接模式的方法。对比学习方法的一个关键方面是选择产生硬负样本的腐败分布&#xff0c;这迫使嵌入模型学习判别表示并找到观察数据的关键特征。虽然早期的方法要么采用过于简单的腐败分布&#xf…

基于java+springboot+vue实现的超市管理系统(文末源码+Lw+ppt)23-354

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对超市管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

坑爹的eslint配置

标题eslint 版本不一致 导致很多问题 比如无法保存的时候校验&#xff0c;首行缩进无效等 babel-eslint这个依赖的版本不一致非常坑 vscode我这里保存下两个版本下的配置 插件eslint 自己下载 1.webpack创建的项目 eslint版本 “eslint”: “^4.19.1”, “eslint-friendly-fo…

蓝桥杯刷题8

1. 世纪末的星期 import java.util.Calendar; public class Main {public static void main(String[] args) {Calendar calendar Calendar.getInstance();for(int year 1999;year<100000;year100){calendar.set(Calendar.YEAR,year);calendar.set(Calendar.MONTH,11);cale…

小苯的回文询问(

题目 离散化存储 #include<bits/stdc.h> using namespace std; #define int long long const int N2e59; int n,q,ans[N],a[N]; map<int,int> mp; vector<pair<int,int>>qr[N]; signed main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);c…

前端面试拼图-数据结构与算法(二)

摘要&#xff1a;最近&#xff0c;看了下慕课2周刷完n道面试题&#xff0c;记录下... 1. 求一个二叉搜索树的第k小值 二叉树(Binary Tree) 是一棵树 每个节点最多两个子节点 树节点的数据结构{value, left?, right?} 二叉树的遍历 前序遍历&#xff1a;root→left→right 中…

C/C++ 语言中的 ​if...else if...else 语句

C/C 语言中的 ​if...else if...else 语句 1. if statement2. if...else statement3. if...else if...else statementReferences 1. if statement The syntax of the if statement is: if (condition) {// body of if statement }The code inside { } is the body of the if …

聚合支付评级较低的机构能否提升评级

聚合支付机构完成备案是合规展业的第一步&#xff0c;同时&#xff0c;一年一度评级结果对其业务开展和收单机构合作发展具有重要的作用&#xff0c;如若评级较低&#xff0c;将影响到其参与商业银行的外包业务投标&#xff0c;支付机构合作协议签署及合作事宜。 近期&#xf…

Chrome浏览器修改网页内容

方法一&#xff1a;使用开发者工具 在Chrome浏览器中打开要修改的网页。按下F12键打开开发者工具。在开发者工具窗口中&#xff0c;找到“Elements”标签页。在“Elements”标签页中&#xff0c;找到要修改的网页元素。双击要修改的网页元素&#xff0c;即可进行编辑。 方法二…

AIGC 训练场景下的存储特征研究

云布道师 引言&#xff1a;在传统块存储大行其道的时代&#xff0c;需要针对很多行业的工作负载&#xff08;Workload&#xff09;进行调研&#xff0c;包含块大小、随机读、读写比例等等。知道行业的 Workload 对于预估业务的 I/OPS、时延、吞吐等性能有很好的指导意义&#…

Cadence——生成Gerber制板文件

软件版本&#xff1a;Cadence SPB OrCAD Allegro 16.6 打开Allegro PCB Designer 选择如下选项&#x1f447; 点击 File–>Open&#xff0c;找到对应的.brd文件 电气错误的检查&#xff1a;点击 Display–>Status&#xff0c;全为绿色则没有错误 按照不同的项目来进…

自幂数之水仙花数(从0开始)

文章目录 概要整体架构流程代码实现小结 概要 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff…

基于stm32与TJC3224T124_011串口屏的PID调参器(附完整工程)

电赛在即&#xff0c;每次比赛调PID都是一件比较繁琐的事。每次都要在程序中改完再烧录到板子上&#xff0c;特别耗时。正好最近发现实验室的一块串口屏比较好玩。 于是就做了这个调PID的东西。它可以通过串口直接修改PID的值&#xff0c;从而达到快速调PID的目的。下面我将完整…

C++学习笔记(lambda函数)

C learning note 1、lambda函数的语法2、lambda函数的几种用法 1、lambda函数的语法 lambda函数的一般语法如下&#xff1a; [ capture_clause ] ( parameters ) -> return_type {function_body }capture_clause&#xff1a;需要捕获的变量&#xff0c;但要求该变量必须在…

【办公类-16-07-07】“2023下学期 中班户外游戏2(有场地和无场地版,每天不同场地)”(python 排班表系列)

作品展示 背景需求&#xff1a; 2024年2月教务组发放的是“每周五天内容相同&#xff0c;两周10天内容相同”的户外游戏安排 【办公类-16-07-05】合并版“2023下学期 大班户外游戏&#xff08;有场地和无场地版&#xff0c;两周一次&#xff09;”&#xff08;python 排班表系…