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

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值