自定义类型:结构体、位段

一、结构体类型的由来

在这里插入图片描述
结构体类型是用来描述复杂的对象的。比如我们想描述一个学生,学生有姓名、性别、年龄、成绩等信息,如果单纯依靠C语言中提供的内置类型,是无法一次性存储学生的这些信息的,因此C语言就提供了自定义类型:结构体类型。结构体类型是存储一个或多个不同类型(以及相同类型)的元素的集合。(数组是存储一个或多个相同类型元素的集合)

二、结构体类型变量的创建与初始化

在这里插入图片描述

struct  student
{
   
	char name[20];
	int age;
	double score;
}a[20];
//运用struct  student类型的结构体创建了一个含有20个元素的数组(全局变量),数组中每个元素都是结构体类型的变量

①结构体类型变量初始化用大括号{}

②结构体类型变量初始化时,既可以按照结构体中的成员列表的顺序初始化;也可以按照指定的的顺序初始化,此时需要使用.操作符。

③结构体成员访问操作符:.与->

a.如果知道结构体类型变量的名字,就可以使用.操作符来访问结构体成员
b.如果知道结构体类型变量的地址,就可以使用->操作符来访问结构体成员

在这里插入图片描述

#include<stdio.h>
/*描述一本书:作者、书名、价格、编号*/
struct Book
{
   
	//成员列表
	char author[20];
	char Book_name[20];
	float price;
	char id[20];
}a3,a4;//a3、a4是全局变量
int main()
{
   
	//按照结构体中成员列表的顺序初始化
	struct Book a1 = {
    "鹏哥","鹏哥C语言",38.8f,"鹏哥20241015"};
	//也可以按照指定的顺序初始化(使用.操作符)
	struct Book a2 = {
    .price = 55.5,.author = "博哥",.Book_name = "博哥数据结构",.id = "博哥20241015" };
	//a1与a2是局部变量

	printf("%s %s %f %s\n", a1.author, a1.Book_name, a1.price, a1.id);
	struct Book* p = &a2;//取出结构体类型变量a2的地址,存放到指向a2的指针变量p中
	printf("%s %s %f %s\n", p->author,p->Book_name,p->price,p->id);
	return 0;
}

在这里插入图片描述

补充1:汉字是一种特殊的长字符,每个汉字都有对应的编码。(就如同每个字符都有对应的Ascll码)不同的编码格式下,每个汉字所占的字节也不同。汉字常见的编码格式有gbk与uft8。在gbk编码格式下,每个汉字占两个字节。

补充2:浮点数在内存中不一定能够精确存储。float类型的浮点数,小数点后面只能存放23个比特位,double类型的浮点数,小数点后面只能存放52个比特位

补充3:由于浮点数在内存中不一定能精确存储,那该如何判断浮点数在内存中的值与真实值在允许的误差内相等呢?

为什么a的值不等于38.8呢,因为浮点数在内存中可能无法精确存储。
在这里插入图片描述
正确写法如下:

#include<stdio.h>
#include <math.h>
int main()
{
   
	float a = 38.8f;
	if (fabs(a - 38.80) < 0.01)
	{
   
		printf("a==38.8\n");
	}
	else
	{
   
		printf("a!=38.8\n");
	}
	return 0;
}

补充4:abs函数与fabs函数的介绍

在这里插入图片描述

三、匿名的结构体类型

①匿名的结构体类型的介绍

在这里插入图片描述
代码1:

typedef struct {
   
	int age;
}zz;
//将这个匿名的结构体类型重命名为zz

int main()
{
   
	zz a = {
    10 };//运用匿名的结构体类型zz创建变量a
	return 0;
}

代码:2:

struct
{
   
	int a;
	float b;
};


struct
{
   
	int a;
	float b;
};
//这两个结构体类型表面看起来是一样的,但由于都是匿名的,所以这两个结构体并不是同一个类型

代码3:

struct
{
   
	int a;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值