自定义类型

结构体类型创建

定义结构体一般的形式为:

struct 结构体类型名

成员列表
}(s1);

struct people
{
	char name[20];
	int age;
	
}(s1);

struct是关键字, 后边加你设置的这个结构体的名字。

s1是设置全局变量。(尽量少设置全局变量)

结构体初始化

可以在声明时直接在后边进按顺序行赋值。
eg:

struct people a={"张三",18};

也可以定义之后逐个赋值
eg:

struct people a;
a.name="张三";
a.age=18;

结构体内存对齐

  1. 结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) ,是指结构体自身成员大小和默认偏移量的较小值。默认偏移量在vs上是8,在linux上是4.
  2. 结构体大小必须是最大成员大小的整数倍。
    eg:
struct test_1
{
	int i;
	char a;
};

test_1的大小为8:
首先i是第一个成员,没有偏移量。占4个字节
a的偏移量是1。放在第5个字节
总大小为5字节,又因为必须是最大成员大小的整数倍,所以补3个字节,得到8字节。

	struct test_2
	{
		char a;
		int i;
		char b;
	};

test_2的大小为12:
首先a为第一个成员,没有偏移量。占1个字节。
i是第二个成员,偏移量为4 。给a补3个字节。i从第5个字节存储,占4个字节。共8字节。
b的偏移量为1,放在第9个字节上。
总大小为9字节,又因为要补到4的倍数,所以为12字节。

位段,位段计算大小

位段:C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。
char 是特殊的int型。
eg:

struct bitfield
{
	char a:2;
	int b:4;
};
  1. 位段成员的类型必须指定为unsigned或int类型。
  2. 一个位段必须存储在同一存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。
  3. 可以定义无名位段。
  4. 位段的长度不能大于存储单元的长度,也不能定义位段数组。
  5. 位段可以在数值表达式中引用,它会被系统自动地转换成整型数。
  6. 位段定义的第一个位段长度不能为0。
  7. 想让下一个位段从下一个存储单元开始存放。可以使用长度为0的位段。

枚举+联合

枚举
如果枚举没有初始化,即省掉"=整型常数"时, 则从第一个标识符开始,顺次赋给标识符0, 1, 2, …。但当枚举中的某个成员赋值后,其后的成员按依次加1的规则确定其值。

enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],

标识符[=整型常数]
} 枚举变量;

  1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
  2. 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。

联合体
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。

union 联合名
{
成员表
}(s1);
s1是设置全局变量。(尽量少设置全局变量)

联合体的内存大小也必须是最大成员大小的整数倍。

union test
{
	int i;
	char a[5];
};

a的字节为5大于i的字节,总字节为5。
又因为要是最多成员的整数倍,所以再补3个字节,为8字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值