对于C语言中自定义类型的部分理解(结构体)

结构体

结构体:结构体是一些成员的集合,这些值被称为成员变量。
常与typedef同用。
每一个结构体都是一种类型。
结构体中可以包含本身结构体指针,占4个字节。

struct student
{
	int num;
	char name[20];
};

结构体的定义和初始化

struct student p1 = { 5 , "Bob"};
//
struct student
{
	int num;
	char name[20];
}p1 = {5,"Bob"};

内存对齐

struct S1
{
	int	 i;
	char a;
	double m;
};

struct S2
{
	int i;
	double m;
	char a;
};

S1 与 S2 成员变量相同所占字节不同

sizeof(S1) == 16;
sizeof(S2) == 24;

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
所占内存为最大对齐数的整数倍。

内存对齐存在的意义:

  1. 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址 处取某些特定类型的数据,否则抛出硬件异常。
  2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理 器需要作两次内存访问;而对齐的内存访问仅需要一次访问 2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理 器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

结构体的内存对齐是拿空间来换取时间的做法。

修改默认对齐数的方法

#program pack(4)   //设置默认对齐数为4 

结构体传参
建议传结构体指针(传递结构体对象开销较大,导致性能下降)

枚举

enum Day{
  Mon,
  Tues,    
  Wed,    
  Thur,    
  Fri,    
  Sat,   
  Sun
}

你也可以给元素赋值,如果你给某个元素赋值,其后元素递增1.(可以在初始化完成)

枚举优点:

  1. 增加代码的可读性和可维护性。
  2. 和#define定义的标识符比较,枚举有类型检查,更加严谨。
  3. 防止了命名污染(封装)。
  4. 便于调试。
  5. 使用方便,一次可以定义多个常量 。

只能拿枚举常量给枚举变量赋值,才不会出现类型的差异

联合(共用体)

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以 联合也叫共用体)。

联合的特点
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合必须得有能力保存最大的那个成员)。

(可以用来判断大小端序)

联合的大小

  1. 最大成员的大小
  2. 内存对齐数的整数倍。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值