07.C语言——自定义类型(结构体、枚举、联合体)


一、结构体声明、定义、初始化

struct People{
	char name[10];
	int age;
};

struct A{
	int id;
};
struct B{
	struct A a;    结构体的成员可以是结构体
	char name[];
}struct People{
	char name[10];
	int age;
}people1,people2;    声明的同时定义,是全局变量

struct People p={"tl",20};    初始化

匿名结构体类型

struct{
	int id;
	char name[20];
}s;

只能使用一次

结构体自引用

struct Node{
	int data;
	struct Node* next;
};

二、结构体成员的访问

1.通过点(.)访问

struct People p={"tl",20};
printf("%s %d\n",p.name,p.age);

2.通过*解引用访问(指针形式)

struct People p={"tl",20};
struct People * pp=p;
printf("%s %d\n",(*pp).name,(*pp).age);

3.通过->访问(指针形式)

struct People p={"tl",20};
struct People * pp=p;
printf("%s %d\n",pp->name,pp->age);

三、结构体传参

结构体传参的时候,要传结构体的地址

1.传结构体

void Print(struct People p){
	printf("%s %d\n",p.name,p.age);
}

struct People p={"tl",20};
Print(p);

2.传结构体地址(优先考虑)

void Print(struct People *p){
	printf("%s %d\n",p->name,p->age);
}

struct People p={"tl",20};
Print(&p);

四、结构体内存对齐

对齐数:VS默认8 Linux没有对齐数
计算步骤

1.结构体第一个成员放在结构体变量在内存中存储位置的0偏移处开始。
2.从第二个成员往后的所有成员,都放在一个对齐数(成员的大小和默认对齐数的较小值)的整数的整数倍的地址处
3.结构体的总大小是结构体的所有成员的对齐数中最大的那个对齐数的整数倍。

4.如果嵌套了结构体,就看嵌套的那个结构体的第一个成员的对齐数,找到整数倍的地址,连续存放嵌套的结构体的大小 数

在这里插入图片描述

在这里插入图片描述

为什么要内存对齐
在这里插入图片描述
总的来说:拿空间换时间

设计结构体的时候:让占用空间小的成员尽量集中在一起

大小 8
struct S1{
	char c1;
	char c2;
	int i;
};


大小 12
struct S2{
	char c1;
	int i;
	char c2;
};

修改默认对齐数

#pragma pack(2)   设置默认对齐数为2
struct S{
	char c1;
	int i;
	char c2;
};
#pragma pack()    取消设置的默认对齐数,还原为默认

五、位段

位段的成员可以是int、unsigned int、signed int、char (整型家族)

struct S{
	char a:3;
	int b:4;
};

在这里插入图片描述

六、枚举

把可能的取值列举

enum Color{
	RED,        默认0开始
	GREEN,      依次递增  1
	BLUE
};

enum Sex{
	Male,    
	Female
};

enum Color c = RED;

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

七、联合(共用体)

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

union Un{
	char c1;
	int i;
};

union Un u={10};
printf("%d\n",u.c1);    结果10
printf("%d\n",u.i);     结果10

联合体的计算

联合体的大小至少是最大成员的大小
当最大成员大小不是最大对齐数的整数倍时,就要对齐道最大对齐数的整数倍

union Un{
	char c1;
	int i;
};
union Un u={10};
printf("%d\n",sizeof(u));    结果4

在这里插入图片描述

union Un{
	char c1[5];
	int i;
};
union Un u={10};
printf("%d\n",sizeof(u));    结果8

在这里插入图片描述

笔试题

判断当前计算机的大小端存储

int check_sys() {
	union Un {

		char c1;
		int i;
	}u;

	u.c1 = 1;

	return u.c1;
	//返回0  低地址存的0,大端
	//返回1  低地址存的1,小端

}


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值