首页 > 其他分享 >C语言(结构体,联合体,枚举的讲解)

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

时间:2024-03-25 14:00:26浏览次数:28  
标签:联合体 编译器 C语言 枚举 内存 str 对齐 结构

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

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

标签:联合体,编译器,C语言,枚举,内存,str,对齐,结构
From: https://blog.csdn.net/HH_KZ1314/article/details/137007091

相关文章

  • 【C语言】字符函数和字符串函数
    前言:在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们一起学习一下这些函数。1.字符分类函数C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是ctype.hiscntrl......
  • c语言 实现切片数组
    c语言集合类第一章切片(本章)第二章栈文章目录c语言集合类前言一、接口定义1、创建切片2、销毁切片3、添加元素4、切片长度5、切片容量二、完整代码三、使用示例1、一般使用流程2、直接append3、自定义类型总结前言由于c语言没有集合类的标准库,需要用时只能自......
  • C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】
    关于内存函数有四个函数需要我们学习。分别是memcpy,memmove,memset和memcmp。都在头文件string.h里面。一.memcpy函数的使用一提到这个函数,我们可能会联想到strcpy函数,但strcpy函数是针对字符串的拷贝。但是我们在写代码的时候不可能只拷贝字符串。 intarr1[]={1,2,3,4,5......
  • 如何使用C语言实现文件操作
    目录文件打开和关闭函数原型案例展示1.引入头文件2.定义字符数组与打开文件3.检查文件打开情况4.读取与写入文件5.关闭文件与清理资源总结文件打开和关闭在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的......
  • 数据结构练习-C语言
    1.假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3包含L中的所有大写字母结点。该算法如何设计?首先创建L1、L2、L3的头结点,......
  • c语言程序设计--实验报告二
    实验项目名称:实验报告2数据描述实验项目类型:验证性实验日期:2024年3月21日一、实验目的1、掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。2、掌握不同数据类型之间赋值的规律。3、学会使用C的有关算术运算符,以及包含这些运算符的表......
  • c语言程序设计——实验报告一
    实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境Windows计算机、Devc6.0三、......
  • C语言 04 基本数据类型
    整数整数就是不包含小数点的数字,整数包含以下几种类型:short:占用2个字节,16个bit位。int:占用4个字节,32个bit位,能够表示-2^32到2^32之间的数字,默认使用这种类型。long:占用8个字节,64个bit位。浮点浮点类型一般用于保存小数。为啥不叫小数类型而是浮点类......
  • C语言整型提升
    C语言中整形算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。就是说表达式中各种长度可能小于int长度的整型值,都必须先转换为int或者unsignedint,然后才能送去CPU去执行运算。如......
  • C语言动态内存管理(重点)
    目录1、为什么要有动态内存分配2、malloc和free2.1malloc函数2.2 free函数3、calloc和realloc3.1  calloc函数 3.2 realloc函数3.3  realloc和malloc区别3.4 realloc函数存在的问题4、常见的动态内存的错误5、动态内存经典笔试题分析6、柔性数......