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

news2024/11/13 10:08:11

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

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

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

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

相关文章

集合(下)Map集合的使用

文章目录 前言一、Map接口二、Map接口的实现类 1.HashMap类2.TreeMap类总结 前言 Map集合没有继承Collection接口&#xff0c;不能像List集合和Set集合那样直接使用Collection接口的方法。Map集合其自身通过以key到value的映射关系实现的集合&#xff0c;也有相应的许多方法。类…

零基础机器学习(3)之机器学习的一般过程

文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化&#xff08;归一化&#xff09;②z-score标准化&#xff08;规范化&#xff09; 5.…

[蓝桥杯 2023 省 A] 颜色平衡树:从零开始理解树上莫队 一颗颜色平衡树引发的惨案

十四是一名生物工程的学生&#xff0c;他已经7年没碰过信息学竞赛了&#xff0c;有一天他走在蓝桥上看见了一颗漂亮的颜色平衡树&#xff1a; [蓝桥杯 2023 省 A] 填空问题 - 洛谷 十四想用暴力解决问题&#xff0c;他想枚举每个节点&#xff0c;每个节点代表一棵树&#xff0…

风险评估在网络安全领域的应用与实践

一、引言 在数字化浪潮席卷全球的今天&#xff0c;网络安全已成为企业运营和发展的核心问题。随着信息技术的快速发展&#xff0c;企业面临着日益复杂的网络安全威胁&#xff0c;如黑客攻击、数据泄露、恶意软件等。这些威胁不仅可能导致企业重要信息的丢失或泄露&#xff0c;…

C++模版(基础)

目录 C泛型编程思想 C模版 模版介绍 模版使用 函数模版 函数模版基础语法 函数模版原理 函数模版实例化 模版参数匹配规则 类模版 类模版基础语法 C泛型编程思想 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。 模板是泛型编程…

Retelling|Facebook2

录音 Facebook 2 Retelling|Facebook2 复述转写 Hi, Im Helen Campbell, from DJ interpretation, European Commission, Im going to talk about Facebook. You Im sure that you are more familiar with Facebook, a lot, a lot more familiar than I than me. But Ive read…

JavaSE系统性总结全集(精华版)

目录 1. 面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;详解 1.1 面向过程和面向对象的区别 1.2面向对象的三大特性 1.2.1 封装 1.2.2 继承 1.2.3 多态 1.2.4 方法重写和方法重载的区别&#xff08;面试题&#xff09; 1.2.5 访问权限修饰符分…

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

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

java的ArrayList类

ArrayList<E>E是自定义数据类型 ArrayList类&#xff1a; 构造函数&#xff1a; 成员方法&#xff1a; public boolean add(E e)&#xff1a; 将指定元素加到集合末尾 Appends the specified element to the end of this list. public class Array {public static…

视觉轮速滤波融合1讲:理论推导

视觉轮速滤波融合理论推导 文章目录 视觉轮速滤波融合理论推导1 坐标系2 轮速计2.1 运动学模型2.2 外参 3 状态和协方差矩阵3.1 状态3.2 协方差矩阵 4 Wheel Propagation4.1 连续运动学4.2 离散积分4.2.1 状态均值递推4.2.2 协方差递推 5 Visual update5.1 视觉残差与雅可比5.2…

P1135 奇怪的电梯 (双向bfs)

输入输出样例 输入 5 1 5 3 3 1 2 5输出 3说明/提示 对于 100%100% 的数据&#xff0c;1≤N≤200&#xff0c;1≤A,B≤N&#xff0c;0≤Ki​≤N。 本题共 1616 个测试点&#xff0c;前 1515 个每个测试点 66 分&#xff0c;最后一个测试点 10 分。 重写AC代码&#xff1…

C++_回文串

目录 回文子串 最长回文子串 分割回文串 IV 分割回文串 II 最长回文子序列 让字符串成为回文串的最少插入次数 回文子串 647. 回文子串 思路&#xff0c;i j表示改范围内是否为回文串&#xff0c; ②倒着遍历是为了取出dp[i 1][j - 1] ③i j 只有一对&#xff0c;不会重复…

每天上万简历,录取不到1%!阿里腾讯的 offer 都给了哪些人?

三月天杨柳醉春烟~正是求职好时节~ 与去年秋招的冷淡不同&#xff0c;今年春招市场放宽了许多&#xff0c;不少企业纷纷抛出橄榄枝&#xff0c;各大厂的只差把“缺人”两个字写在脸上了。 字节跳动技术方向开放数10个类型岗位&#xff0c;研发需求占比60%&#xff0c;非研发新增…

【数据结构】双向奔赴的爱恋 --- 双向链表

关注小庄 顿顿解馋๑ᵒᯅᵒ๑ 引言&#xff1a;上回我们讲解了单链表(单向不循环不带头链表)&#xff0c;我们可以发现他是存在一定缺陷的&#xff0c;比如尾删的时候需要遍历一遍链表&#xff0c;这会大大降低我们的性能&#xff0c;再比如对于链表中的一个结点我们是无法直接…

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 …

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

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

代码随想录训练营Day33:● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果

1005.K次取反后最大化的数组和 题目链接 https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/ 题目描述 思路 1、自己的想法 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {sorted(nums);//遇到 <0 的 &#xff0c;就…

CTF题型 nodejs(1) 命令执行绕过典型例题

CTF题型 nodejs(1) 命令执行绕过 文章目录 CTF题型 nodejs(1) 命令执行绕过一.nodejs中的命令执行二.nodejs中的命令绕过1.编码绕过2.拼接绕过3.模板字符串4.Obejct.keys5.反射6.过滤中括号的情况典型例题1.[GFCTF 2021]ez_calc2.[西湖论剑 2022]Node Magical Login 一.nodejs中…

黑马头条day5总结

1、surefire-reports for the individual test results. 借鉴&#xff1a;【已解决】surefire-reports for the individual test results.-CSDN博客 Please refer to D:\javashizhan01\heima-leadnews\heima-leadnews-service\heima-leadnews-article\target\surefire-report…

手撕算法-数组中的第K个最大元素

描述 分析 使用小根堆&#xff0c;堆元素控制在k个&#xff0c;遍历数组构建堆&#xff0c;最后堆顶就是第K个最大的元素。 代码 class Solution {public int findKthLargest(int[] nums, int k) {// 小根堆PriorityQueue<Integer> queue new PriorityQueue<>…