• C语言入门Day_26 结构体


    目录

    前言:

    1.结构体的定义 

    2.结构体的使用

    3.易错点

    4.思维导图 


    前言:

    变量只能表示单一的属性,比如用int去表示一个年龄,用float去表示一个身高或一个体重,一个字符串/字符数组去表示一个性别或一个名字。

    1. int tony_age = 18;
    2. float tony_height = 172.0;
    3. float tony_weight = 74.0;

    而真实世界里面的事物往往有多个属性。比如一个人它既有年龄,身高,体重,也有名字,性别,

    在C语言中我们使用一种特殊的数据结构来表示它,它就叫做struct结构体)。

    1.结构体的定义 

    1.1

    truct又叫结构,或者结构体,往往包含多个不同数据类型的变量。

    下面我们来看一看一个struct的定义:

    1. struct People
    2. {
    3. char name[20];
    4. int age;
    5. float height;
    6. float weight;
    7. };

    1.struct关键字,声明这是一个struct结构体

    struct

    2.struct名,又叫结构名

    People

    3.struct中的第一个成员,一个字符数组name

    char name[20];

    4.struct中的第二个成员,一个整型变量int

    int age;

    1. struct People
    2. {
    3. char name[20];
    4. int age;
    5. float height;
    6. float weight;
    7. };

    5.struct中的第三个成员,一个浮点型变量height

    float height;

    6.struct中的第四个成员,一个浮点型变量weight

    float weight;

    7.结构中的成员需要用花括号{}括起来

    {

    }

    1.2

    我们来自己定义一个结构体Book,它有三个成员,字符数组name,整型页数pages,浮点型价格price。

    1. struct Book
    2. {
    3. char name[20];
    4. int pages;
    5. float price;
    6. };

     1.先填入结构体关键字struct

     2.再填入结构体的名字Book

     3.然后填入花括号{}

    4.分别填入三个不同成员的数据类型

    定义了一个struct结构体以后,我们就可以用它来定义一个结构体变量,这个结构体变量的数据类型当然就是这个我们定义好的struct了。

    1.3

    我们来看看如何定义一个结构体变量:

    1. struct People
    2. {
    3. char name[20];
    4. int age;
    5. float height;
    6. float weight;
    7. };
    8. struct People people_a;
    9. struct People people_b;

    1.结构体的定义

    struct People { }

    2.用结构体People声明一个变量people_a

    3.声明变量也需要用到结构体关键字struct

    4.结构体的名字People

    5.用结构体People声明的变量people_b

    1.4

    我们也可以使用下面的方式来定义一个结构体变量,在结构体的末尾加上变量的名字。但我们还是推荐上面这种,代码更清晰,理解成本也会更低一点。 

    1. struct Book
    2. {
    3. char name[20];
    4. int pages;
    5. float price;
    6. } book_a;

    1.5

    完成结构体和结构体变量的定义以后,我们就可以开始对它进行赋值和使用

    首先是赋值

    1. struct People
    2. {
    3. char name[20];
    4. int age;
    5. float height;
    6. float weight;
    7. };
    8. struct People people_a;
    9. people_a = {"Liming", 19, 178.0, 75.0};

    1.结构体的定义

    struct People{}

    2.用定义好的结构体People来声明一个变量people_a

    struct People people_a;

    3.给变量进行赋值

    people_a = {"Liming", 19, 178.0, 75.0};

    1. struct People
    2. {
    3. char name[20];
    4. int age;
    5. float height;
    6. float weight;
    7. };
    8. struct People people_a;
    9. people_a = {"Liming", 19, 178.0, 75.0};

    4.第一个给变量name赋值"Liming"

    5.第二个给变量age赋值19

    6.第三个给变量height赋值178.0

    7.第四个给变量weight赋值75.0

    1.6

    需要注意的是,我们是给struct的成员按照顺序,挨个赋值的。 

    1. struct Book
    2. {
    3. char name[20];
    4. int pages;
    5. float price;
    6. };
    7. struct Book book_a;
    8. book_a
    9. book_a = {"ABC", 100, 15.0};

    1.我们来给结构体Book定义的变量进行一次赋值,注意对应的顺序,先填入变量名book_a

    代码编辑器。

    2.然后填入赋值符号=和花括号{}

    3.依次填入三个结构体成员变量的数值,第一个是"ABC",注意数据类型的对应:

    4.然后是pages的值,100:

    5.最后是浮点变量price的值15.0:

    到这里我们就完成了一个结构体的定义,结构体变量的声明,和结构体变量的赋值了。

    2.结构体的使用

    2.1

    前面我们更多在讲解语法细节上面。需要注意的是,struct的定义需要在main函数前面(外部),就像函数的定义一样。

    除了一次性给全部结构体成员进行赋值以外,我们也可以根据需要给单个结构体变量进行赋值。

    2.2

    这是一个期末考试成绩单的结构体Record,我们来给它单个成员进行赋值: 

    1. struct Record
    2. {
    3. float yuwen;
    4. float shuxue;
    5. float yingyu;
    6. };
    7. int main() {
    8. struct Record record_2023;
    9. record_2023.yuwen = 99.5;
    10. record_2023.shuxue = 100.0;
    11. record_2023.yingyu = 98.5;
    12. }

    1.定义结构体Record

    struct Record{}

    2.声明一个结构体变量record_2023

    struct Record record_2023;

    3.给结构体成员变量yuwen赋值99.5

    record_2023.yuwen = 99.5;

    1. struct Record
    2. {
    3. float yuwen;
    4. float shuxue;
    5. float yingyu;
    6. };
    7. int main() {
    8. struct Record record_2023;
    9. record_2023.yuwen = 99.5;
    10. record_2023.shuxue = 100.0;
    11. record_2023.yingyu = 98.5;
    12. }

    4.给结构体成员变量shuxue赋值100.0

    record_2023.shuxue = 100.0;

    5.给结构体成员变量yingyu赋值98.5

    ecord_2023.yingyu = 98.5;

    6.main函数,结构体的定义需要放在main函数以外

    int main () {}

    7.我们注意到它的访问方式是通过点.来实现的

    2.3

    结构体变量访问自己成员是通过英文句号.来实现的:

    1. record_2023.yuwen = 99.5;

    对结构体里面单个成员变量进行赋值访问的方式都是一样的,通过英文符号.来实现

    2.4

    1. struct Record
    2. {
    3. float yuwen;
    4. float shuxue;
    5. float yingyu;
    6. };
    7. int main() {
    8. struct Record record_2025 = {90.0, 93.5, 98.0};
    9. printf("%.1f\n", record_2025.yuwen);
    10. printf("%.1f\n", record_2025.shuxue);
    11. printf("%.1f\n", record_2025.yingyu);
    12. }

    1.定义一个结构体Record

    struct Record { };

    2.定义一个结构体变量,并进行初始化赋值

    struct Record record_2025 = {90.0, 93.5, 98.0};

    3.打印输出这个结构体变量的三个数值

    printf("%.1f\n", record_2025.yuwen);

    printf("%.1f\n", record_2025.shuxue);

    printf("%.1f\n", record_2025.yingyu);

    4.同样的,我们通过英语句号.来访问结构体的成员

    2.5

    指针,作为C语言最灵活的机制(有人也说指针是C语言的精髓所在),也可以用来指向一个结构体,我们来看看:

    定义一个某种结构体的指针,并指向一个变量,然后访问它:

    1. struct Record
    2. {
    3. float yuwen;
    4. float shuxue;
    5. float yingyu;
    6. };
    7. int main() {
    8. struct Record record_2025 = {90.0, 93.5, 98.0};
    9. struct Record *sp1;
    10. sp1 = &record_2025;
    11. printf("%f\n", sp1->yuwen);
    12. sp1->yuwen = 100.0;
    13. printf("%f\n", sp1->yuwen);
    14. }

    1.定义一个Record结构的指针

    struct Record *sp1;

    2.把指针指向结构体变量record_2025

    sp1 = &record_2025;

    3.打印结构体变量yunwen

    printf("%f\n", sp1->yuwen);

    4.指针去访问一个结构体成员使用->符号

    5.以及对于结构体来说,不需要使用指针运算符*

    sp1->yuwen

    2.6

    一个结构体的指针和一个普通变量的指针,在使用上最大的区别就是,普通变量的指针需要使用指针运算符*来访问,结构体的指针则不需要

    使用结构体变量访问成员的时候,是用英文句号.

    使用结构体指针来访问成员的时候,是用减号+右箭头符号->

    2.7

    我们自己来写一遍用结构体指针访问成员的代码

    1. struct Record record_2025 = {90.0, 93.5, 98.0};
    2. struct Record *sp1;
    3. sp1 = &record_2025;
    4. printf("%.1f\n", sp1->yuwen);
    5. sp1->yuwen = 100.0;
    6. printf("%.1f\n", sp1->yuwen);

    1.填入结构体指针访问成员的符号->

    2.填入指针访问成员的代码:

    sp1->yuwen

    3.易错点

    结构体定义和声明后面记得不要丢掉分号!

    输出每个结构体成员时应该对应该类型的格式符。

    4.思维导图 

    最后我想说的是:

     在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。

  • 相关阅读:
    破纪录者(Google Kickstart2020 Round D Problem A)
    JVM对象创建与内存分配
    《护理教育学》名词解释、简答题、问答题汇总
    pytorch深度学习实战lesson9
    算法工程师 | 如何快速 了解,掌握一个算法!脚踏实地,迎着星辰,向前出发 ~
    element-plus el-button 自定义添加icon的方法
    Unity ProjectTiny动态改变UV显示指定部分的纹理
    在linux(centOS 7)服务器上操作数据库
    深入理解浏览器渲染原理
    当SSC遇见RPA:最大化发挥共享服务模式效用
  • 原文地址:https://blog.csdn.net/fantastic_little/article/details/133284247