• C语言的结构体


    目录

    结构体的基本概念

    声明结构体

    结构体的成员

    先定义结构体,然后再创建结构体变量

    在定义结构体的同时定义结构体变量

    在定义结构体变量的时候也可以同时赋值 

     如果只需要stu1、stu2两个变量,后面不再需要使用结构体数据类型,定义其他变量(匿名结构体)

    成员的获取和赋值

    赋值练习

     声明结构体的内存

     结构体的练习

    养猫问题

    结构体变量值传递

    结构体变量地址传递

    盒子案例

    结构体值传递

    结构体地址传递

    结构体的基本概念

    • 结构体是自定义的数据类型
    • 结构体变量代表一个具体变量
    1. int num1;//int 是数据类型,而num1是一个具体的int变量
    2. struct Cat cat1;//Cat是结构体数据类型,而cat1是一个Cat变量

    声明结构体

    1. struct 结构体名称 { // 结构体名首字母大写,比如Cat, Person
    2. 成员列表;
    3. };

    声明一个结构体变量,无论是否初始化,都开辟内存,声明一个结构体指针变量,对其初始化的时候才会开辟内存 

    结构体的成员

    成员是结构体上的一个组成部分,一般是基本数据类型、也可以是数组、指针、结构体等

    在创建一个结构体变量后,需要给成员赋值,如果没有赋值就使用可能导致程序异常终止

    不同结构体的变量的成员独立,互不影响,一个结构体变量的成员更改,不影响另外一个

    定义结构体,然后再创建结构体变量

    1. struct Stu{
    2. char *name; //姓名
    3. int num; //学号
    4. int age; //年龄
    5. char group; //所在学习小组
    6. float score; //成绩
    7. };
    8. struct Stu stu1, stu2;
    9. //定义了两个变量 stu1 和 stu2,它们都是 Stu 类型,都由 5 个成员组成
    10. //注意关键字struct不能少

    在定义结构体的同时定义结构体变量

    1. struct Stu{
    2. char *name; //姓名
    3. int num; //学号
    4. int age; //年龄
    5. char group; //所在学习小组
    6. float score; //成绩
    7. } stu1, stu2;
    8. //在定义结构体Stu 的同时,创建了两个结构体变量 stu1 和 stu2

    在定义结构体变量的时候也可以同时赋值 

    1. struct Student{
    2. char *name; //姓名
    3. int num; //学号
    4. int age; //年龄
    5. char group; //所在小组
    6. float score; //成绩
    7. } stu1 = {"贾宝玉", 11, 18, 'B', 90.50}, stu2 = { "林黛玉", 12, 16, 'A', 100 };

     如果只需要stu1、stu2两个变量,后面不再需要使用结构体数据类型,定义其他变量(匿名结构体)

    1. struct { //没有写 Stu
    2. char *name; //姓名
    3. int num; //学号
    4. int age; //年龄
    5. char group; //所在学习小组
    6. float score; //成绩
    7. } stu1, stu2;
    8. stu1.name = "tom"; stu1.num = 100;....
    9. //1. 该结构体数据类型,没有名, 匿名结构体
    10. //2. stu1 和 stu2 就是 该结构体的两个变量

    成员的获取和赋值

     结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[]获取单个元素,结构体使用.号获取单个成员。

    获取结构体成员的一般格式为:结构体变量名.成员名

    1. struct{
    2. char *name; //姓名
    3. int num; //学号
    4. int age; //年龄
    5. char group; //所在小组
    6. float score; //成绩
    7. } stu1;
    8. stu1.name = "jack";
    9. printf("%s", stu1.name);

    赋值练习

    1. #include
    2. void main() {
    3. struct Student{
    4. char *name; //姓名
    5. int num; //学号
    6. int age; //年龄
    7. char group; //所在小组
    8. float score; //成绩
    9. } stu1 = {"贾宝玉", 11, 18, 'B', 90.50}, stu2 = { "林黛玉", 12, 16, 'A', 100 };
    10. struct Student stu3 = {"林黛玉2", 12, 16, 'A', 100 };
    11. struct Student stu4;
    12. //stu4 = {"林黛玉2", 12, 16, 'A', 100 };//会有问题
    13. stu4.name = "smith";//没问题
    14. printf("\n stu1.name=%s", stu1.name);
    15. printf("\n stu3.name=%s", stu3.name);//
    16. printf("\n stu4.name=%s", stu4.name);
    17. getchar();
    18. }

     声明结构体的内存

     结构体的练习

    养猫问题

    1. #include
    2. void main() {
    3. /*
    4. 张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。
    5. 请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。
    6. 如果用户输入的小猫名错误,则显示 张老太没有这只猫猫。
    7. 分析:
    8. 1. 猫猫有 三个成员(变量)组成
    9. 2. 使用结构体解决
    10. */
    11. //创建 结构体Cat 【是数据类型】
    12. struct Cat {//结构体的名字Cat,Cat就是我们自己构造的数据类型
    13. char* name;//名字,使用指针,指向一个字符串
    14. int age;//年龄
    15. char* color;//颜色
    16. };
    17. //使用结构体Cat创建对应的变量
    18. struct Cat cat1;//cat1就是struct Cat的一个变量
    19. struct Cat cat2;
    20. //给cat1的各个成员赋值
    21. cat1.name = "小白";
    22. cat1.age = 3;
    23. cat1.color = "白色";
    24. cat2.name = "小花";
    25. cat2.age = 100;
    26. cat2.color = "花色";
    27. //输出两只猫的信息
    28. printf("\n第一只猫 name = %s, age = %d, color = %s", cat1.name, cat1.age, cat1.color);
    29. printf("\n第二只猫 name = %s, age = %d, color = %s", cat2.name, cat2.age, cat2.color);
    30. getchar();
    31. }

    结构体变量值传递

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. /*
    4. 编写一个Dog结构体,包含name(char[10])、age(int)、weight(double)属性
    5. 编写一个say函数,返回字符串,信息中包含所有成员值。
    6. 在main方法中,创建Dog结构体变量,调用say函数,将调用结果打印输出。
    7. */
    8. //定义Dog结构体
    9. struct Dog {
    10. char * name;
    11. int age;
    12. double weight;
    13. };
    14. //say函数,返回字符串,信息中包含所有成员值
    15. char * say(struct Dog dog) {
    16. //将这个信息放入到一个字符串(字符数组)
    17. static char info[50]; //局部静态变量
    18. sprintf(info, "name=%s age=%d weight=%.2f", dog.name, dog.age, dog.weight);
    19. //sprintf函数用于将格式化的数据写入字符串
    20. dog.name = "小花";
    21. return info;
    22. }
    23. void main() {
    24. //测试
    25. //定义结构体变量
    26. struct Dog dog;
    27. char * info = NULL;
    28. dog.name = "小黄";
    29. dog.age = 1;
    30. dog.weight = 3.4;
    31. info = say(dog); //结构体变量默认是值传递
    32. printf("\n 小狗信息=%s", info);
    33. printf("\n main 小狗名字=%s", dog.name);//如果结构体变量是地址传递,则可能小狗名字就会改变了
    34. getchar();
    35. }

    结构体变量地址传递

    1. #include
    2. #include
    3. /*
    4. 1.一个景区根据游人的年龄收取不同价格的门票。
    5. 2.请编写游人结构体(Visitor),根据年龄段决定能够购买的门票价格并输出
    6. 3.规则:年龄>18 , 门票为20元,其它情况免费。
    7. 4.可以循环从控制台输入名字和年龄,打印门票收费情况, 如果名字输入 n ,则退出程序。
    8. */
    9. //定义结构体
    10. struct Visitor {
    11. char name[10];
    12. int age;
    13. double pay; //应付票价
    14. };
    15. //编写函数处理业务
    16. //说明:因为结构体默认是值传递,会拷贝一份完整数据,效率较低
    17. // 因此,为了提高效率,我们直接接收地址(指针)
    18. void ticket(struct Visitor * visitor) {//结构体指针类型
    19. //判断
    20. if( (*visitor).age > 18) {
    21. (*visitor).pay = 20;
    22. } else {
    23. (*visitor).pay = 0;
    24. }
    25. }
    26. void main() {
    27. //测试
    28. //创建结构体变量(创建一个游客)
    29. struct Visitor visitor;
    30. //循环的输入名字和年龄
    31. while(1) {
    32. printf("\n 请输入游客名字");
    33. scanf("%s", visitor.name);
    34. //判断如果名字输入 n ,则退出程序
    35. if(!strcmp("n", visitor.name) ) {
    36. break;
    37. }
    38. printf("\n 请输入游客年龄");
    39. scanf("%d", &visitor.age);
    40. //调用函数 ticket , 获取应付的票价
    41. ticket(&visitor);
    42. printf("\n 该游客应付票价=%.2f", visitor.pay);
    43. }
    44. printf("退出程序");
    45. getchar();
    46. getchar();
    47. }

    盒子案例

    结构体值传递

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. #include
    4. /*1) 编程创建一个Box结构体,在其中定义三个成员表示一个立方体的长、宽和高,长
    5. 宽高可以通过控制台输入。
    6. 2) 定义一个函数获取立方体的体积(volume)。
    7. 3) 创建一个结构体,打印给定尺寸的立方体的体积。
    8. 4) 思路
    9. */
    10. //值传递
    11. //定义结构体
    12. struct Box {
    13. double len;
    14. double width;
    15. double height;
    16. double volumn;//体积
    17. };//一定要有这个;
    18. double getVolumn(struct Box Box) {
    19. Box.volumn = Box.len * Box.width * Box.height;
    20. return Box.volumn;
    21. }
    22. void main() {
    23. //创建结构体变量
    24. struct Box Box;
    25. printf("请输入立方体的长: ");
    26. scanf("%lf", &Box.len);
    27. printf("请输入立方体的宽: ");
    28. scanf("%lf", &Box.width);
    29. printf("请输入立方体的高: ");
    30. scanf("%lf", &Box.height);
    31. double volumn = getVolumn(Box);
    32. printf("立方体的体积为%.2f\n", volumn);
    33. printf("退出程序");
    34. getchar();
    35. getchar();
    36. }

    结构体地址传递

    1. double getVolumn(struct Box *Box) {
    2. return ((*Box).len) * ((*Box).width) * ((*Box).height);
    3. }

    只需要更改获取立方体体积的函数

  • 相关阅读:
    使用redis构建简单的社交网站
    Django使用正则表达式
    Selenium4 新特性
    SpringBoot整合H2新手入门
    理解 Redis 新特性:Stream
    MySQL主从复制原理和使用
    智慧城市数据大融合的几点想法
    Python 函数方法的类型注解
    SpringBoot集成redis依赖包及步骤
    UVM driver和sequencer握手机制 get_next_item() 和 get() and put()
  • 原文地址:https://blog.csdn.net/qq_47896523/article/details/126474051