一、结构体类型的由来
结构体类型是用来描述复杂的对象的。比如我们想描述一个学生,学生有姓名、性别、年龄、成绩等信息,如果单纯依靠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;