自定义类型:结构体,枚举,联合

知识点:

1.结构体类型创建
c语言允许用户自己由不同类型数据组成的组合型的数据结构,它称为结构体(structre).在其他一些高级语言中称为"记录"(record).
eg:
structre Student{
int num; //学号为整型
char name[20]; //姓名为字符串
char sex; //性别为字符型
int age;//年龄为整型
float score;//成绩为浮点型
char addr[30];//地址为字符型
}; //注意最后有一个分号

2.结构体初始化

#inciude <stdio.h>
int main() {
structre Student { //声明结构体类型struct Student
long int num; //以下4行为结构体的成员
char name[20];
char sex;
char addr[20];
}a = {10101,“Li Lin”,‘M’,"123 Shanghai Road};
return 0;
}

3.结构体内存对齐

在C99标准中,对于内存对齐的细节没有作过多的描述,具体的实现交由编译器去处理,所以在不同的编译环境下,内存对齐可能略有不同,但是对齐的最基本原则是一致的,对于结构体的字节对齐主要有下面两点:

  1)结构体每个成员相对结构体首地址的偏移量(offset)是对齐参数的整数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟空间时,首先检查预开辟空间的地址相对于结构体首地址的偏移量是否为对齐参数的整数倍,若是,则存放该成员;若不是,则填充若干字节,以达到整数倍的要求。

  2)结构体变量所占空间的大小是对齐参数大小的整数倍。如有需要会在最后一个成员末尾填充若干字节使得所占空间大小是对齐参数大小的整数倍。

对于第二条原则,结构体变量所占空间的大小是对齐参数的整数倍。这句话中的对齐参数有点复杂,它是取结构体中所有变量的对齐参数的最大值和系统默认对齐参数#pragma pack(n)比较,较小者作为对齐参数。举个例子假如在结构体A中先后定义了两个变量int a;double b;对于变量a,它的自身对齐参数为4,而#pragma pack(n)值默认为8,则a的对齐参数为4;b的自身对齐参数为8,而#pragma pack(n)的默认值为8,则b的对齐参数为8。由于a的最终对齐参数为4,b的最终对齐参数为8,那么两者较大者是8,然后再拿8和#pragma pack(n)作比较,取较小者作为对齐参数,也就是8,即意味着结构体最终的大小必须能被8整除。

4.位段,位段计算机大小。

struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
}
A就是一个位段.
大小:printf("%d\n", sizeof(struct A));

5.枚举+联合。

枚举顾名思义就是列举.
把可能的取值列举.
enum Sex//性别
{
MALE,
FEMALE,
SECRET,//秘密
};
联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系类成员,特征是这些成员公用同一块空间(所以联合体也叫公用体);

//联合体声明
union Un
{
char c;
int i;
};

//联合体变量定义
union Un un;;
//计算连个变量的大小
printf("%d\n", sizeof(un));

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值