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,才是数字0
			if (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的整型二维数组,开辟好后,使用二维数组的下标访问形式,访问空间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《剑指 Offer》专项突破版 - 面试题 93 : 最长斐波那契数列(C++ 实现)

题目链接&#xff1a;最长斐波那契数列 题目&#xff1a; 输入一个没有重复数字的单调递增的数组&#xff0c;数组中至少有 3 个数字&#xff0c;请问数组中最长的斐波那契数列的长度是多少&#xff1f;例如&#xff0c;如果输入的数组是 [1, 2, 3, 4, 5, 6, 7, 8]&#xff0…

【数据结构与算法】用染色法判定二分图

问题描述 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数 n 和 m。 接下来 m 行&#xff0c;每行包含两个整数 u 和 v&#xff0c;表示点 u 和点 v 之间存在一条边。 输出格式 如果给定图…

QML | JavaScript作用域和命名解析2

QML | JavaScript作用域和命名解析3.绑定的作用域对象 属性绑定是QML中最常见的JavaScript应用。属性绑定关联了一个JavaScript表达式的结果和对象的一个属性,该属性所归属的对象被称为绑定的作用域对象。在下面的代码中,Item对象就是一个绑定的作用域对象: ​ 绑定可以…

泰山派人工智能

这里我们先演示一下人工智能能干些什么吧, 请看下面演示资料 https://www.bilibili.com/v/jump-middle-edge/?spm_id_from=888.80997.embed_other.whitelist&mode=play&bvid=BV1Kh411N7b1 图像的人工智能常见的任务有如下几种情况: 分类, 目标检测,目标分割, 轨迹跟…

Matlab|基于两阶段鲁棒优化的微网电源储能容量优化配置

目录 主要内容 1.1 目标函数 1.2 约束条件 1.3 不确定变量 部分代码 结果一览 下载链接 主要内容 程序主要复现的是《考虑寿命损耗的微网电池储能容量优化配置》&#xff0c;解决微网中电源/储能容量优化配置的问题&#xff0c;即风电、光伏、储能以及燃气轮机…

上海市开展专项行动,提升车联网行业网络和数据安全防护水平

近日&#xff0c;上海市通信管理局发布了《关于开展“铸盾车联”2024年车联网网络和数据安全专项行动的通知》。通知中提到&#xff0c;此次专项行动是为了提升本市车联网行业网络和数据安全防护水平&#xff0c;筑牢车联网网络和数据安全防线&#xff0c;护航智能网联汽车产业…

#Linux系统编程(exec函数族)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;为什么介绍exec函数族 在父进程fork()创建子进程中&#xff0c;子进程会拷贝父进程的代码&#xff0c;但是有时候不想要子进程拷贝父进程的…

c语言--实用调试技巧

1什么是bug 2调试是什么&#xff0c;有多重要&#xff1f; 3debug与release 4windows环境调试简绍 5一些调试的实例 6如何写出好的代码&#xff08;便于调试&#xff09; 7编程常见错误 1什么是bug 导致计算机出现问题就叫bug 2调试是什么&#xff0c;有多重要&#x…

【JavaEE初阶系列】——多线程案例一——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)

目录 &#x1f6a9;单例模式 &#x1f388;饿汉模式 &#x1f388;懒汉模式 ❗线程安全问题 &#x1f4dd;加锁 &#x1f4dd;执行效率提高 &#x1f4dd;指令重排序 &#x1f36d;总结 单例模式&#xff0c;非常经典的设计模式&#xff0c;也是一个重要的学科&#x…

007 日期类型相关工具类

推荐一篇文章 http://t.csdnimg.cn/72F7Jhttp://t.csdnimg.cn/72F7J

git配置密钥

要配置 Git 密钥&#xff0c;可以按照以下步骤进行操作&#xff1a; 1.生成密钥&#xff1a;首先&#xff0c;在终端或命令提示符中运行以下命令生成密钥对&#xff1a; ssh-keygen -t rsa -b 4096 -C "dengweng-pulse.net"这将生成一个 RSA 密钥对&#xff0c;其中…

clickhouse学习笔记02(小滴课堂)

ClickHouse核心基础-常见数据类型讲解 插入数据&#xff1a; decimal类型的数据&#xff0c;整数部分超了会报错&#xff0c;小数部分超了会截取。 查看表结构&#xff1a; 查询&#xff1a; 插入&#xff1a; 更新操作&#xff1a; 这个和mysql的语句不太一样。 删除语句和my…

第十二届蓝桥杯JavaB组省赛真题 - 货物摆放

解题思路&#xff1a; 暴力 优化前&#xff08;代码没有错&#xff0c;但会超时&#xff09;&#xff1a; import java.util.*;public class Main {public static void main(String[] args) {long n 2021041820210418L;long cnt 0;for (long a 1; a < n; a) {for (lon…

【Java程序设计】【C00364】基于Springboot的美发管理系统(有论文)

基于Springboot的美发管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及idea&…

第一天工作我的

工作的第一件事情打开文件信息 开始工作了 太过分了 启动 出现了这样的错误 我这里写的有什么问题吗? computed: {getGroundCtcOptions() {var dis [];for (let i in ctcDataRef.value) {dis.push({label: ctcDataRef.value[i].name,value: ctcDataRef.value[i].id,});}retur…

iPhone 16将接入百度AI功能

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 ​百度接了个大活儿&#xff0c;将为国行iPhone 16提供AI功能。这消息一出&#xff0c;基本可以确立百度在AI界领头羊的地位了。百度这些年一直在无人驾驶、AI大模型方面发力&#xff0c;看来还是有成就的&#xf…

第十二届蓝桥杯JavaB组省赛真题 - 路径

解题思路&#xff1a; 动态规划 需要熟练掌握最小公倍数和最大公约数的计算 import java.util.*;public class Main {public static void main(String[] args) {int[] dp new int[2022];dp[1] 0;for (int i 2; i < 2021; i) {dp[i] Integer.MAX_VALUE;}for (int i 1…

【MATLAB源码-第13期】基于matlab的4ASK的误码率BER和误符号率SER理论和实际对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 "4ASK" 是一种数字调制技术&#xff0c;代表4级振幅移移键控&#xff08;4-Level Amplitude Shift Keying&#xff09;调制。它是一种数字通信中常用的调制方式之一&#xff0c;用于将数字信号转换为模拟信号以便传…

《量子计算:揭开未来科技新篇章》

随着科技的不断发展&#xff0c;量子计算作为一项颠覆性的技术逐渐走进人们的视野&#xff0c;引发了广泛的关注和探讨。本文将围绕量子计算的技术进展、技术原理、行业应用案例、未来趋势预测以及学习路线等方向&#xff0c;深入探讨这一领域的前沿动态和未来发展趋势。 量子…

c++初阶------c++代码模块

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…