• c++ 结构体


    1、结构体定义

    整形、长整形、字符型以及浮点型等这些数据类型指南记录单一的数据,而这些数据只能被称为基础数据类型。如果需要定义某种类型,同时包含以上几种的基本数据类型。比如一个人同时含有身高、体重以及年龄的属性。而结构体就是将这些变量类型包含在一起,大大减少程序代码的离散性,使程序代码阅读更加符合逻辑。其一般的定义格式如下:

    1. struct 结构体类型名称
    2. {
    3. 成员类型 成员名;
    4. ...
    5. 成员类型 成员名;
    6. };

    struct就是定义结构体的关键字。结构体类型名称就是一种标识符,该标识符表示一个新的变量。结构体是以大括号括起来且以分号结尾。例如定义一个学生结构体,包含年龄、分数和姓名属性。

    1. struct Student {
    2. string name; //学生姓名
    3. int age; //学生年龄
    4. int score; //学生分数
    5. };

    注意一点,结构体由不同类型的数据组成的数据集合,而数组是相同元素的集合。

    2、结构体声明

    2.1 常规声明

    1. struct Student1 {
    2. int age;
    3. };

    2.2 在声明之后立刻创建

    1. struct Student2 {
    2. int age;
    3. } stu2;
    4. //也可以同时声明多个变量
    5. struct Student2 {
    6. int age;
    7. } stu2,stu22;

    2.3 typedef声明(类型别名声明)

    1. typedef struct Student3 {
    2. int age;
    3. } stu3;

    2.4 匿名结构体

    1. struct {
    2. int age;
    3. } stu4;

    2.5 匿名结构体+typedef

    1. typedef struct {
    2. int age;
    3. } Student5;

    3、结构体成员及初始化

    引用结构体成员有两种方式,一种是声明结构体变量后,通过成员运算符“.”引用;一种是声明结构体指针变量,使用指向"->"运算符引用。

    (1)使用“."应用结构体成员。

    1. struct Student {
    2. string name;
    3. int score;
    4. int age;
    5. };
    6. int main() {
    7. struct Student student;//struct可以省略
    8. student.age = 18;
    9. student.name = "树哥";
    10. student.score = 60;
    11. return 0;
    12. }

    注意:结构体可以在定义时直接对结构体变量赋值,例如:

    struct Student student2={ "树哥",60,18};

    (2)在定义结构体时,可以同时声明结构体指针变量,例如:

    1. struct Student {
    2. string name;//姓名
    3. int score;//分数
    4. int age;//年龄
    5. } * student;
    6. int main() {
    7. student->name = "树哥";
    8. student->age = 18;
    9. student->score = 60;
    10. return 0;
    11. }

    注意:指针结构体指针只有初始化后才可以使用。

    4、结构体与函数

    结构体数据类型在c++语言中是可以作为函数参数传递的,可以直接使用结构体变量做函数的参数,也可以使用结构体指针变量做函数参数。

    4.1 结构体变量做函数参数

    1. #include
    2. using namespace std;
    3. //定义学生结构体定义
    4. struct student {
    5. string name;
    6. int age;
    7. int score;
    8. };
    9. //自定义函数,打印学生信息
    10. void printfStudent(student stu) {
    11. cout << "姓名:" << stu.name << " 年龄: " << stu.age << " 分数:"
    12. << stu.score << endl;
    13. }
    14. int main() {
    15. //声明结构体
    16. student stu = {"张三", 18, 100};
    17. //调用自定义函数
    18. printfStudent(stu);
    19. return 0;
    20. }

    4.2 结构体指针做函数参数

    使用结构体指针变量做函数参数时传递的只是地址,这样的方式减少了时间和空间上的开销,能够有效提高程序的运行效率。

    1. #include
    2. using namespace std;
    3. //定义学生结构体定义
    4. struct student {
    5. string name;
    6. int age;
    7. int score;
    8. };
    9. //自定义函数 打印学生信息
    10. void printfStudent2(student* stu) {
    11. cout << "姓名:" << stu->name << " 年龄: " << stu->age << " 分数:"
    12. << stu->score << endl;
    13. }
    14. int main() {
    15. student stu = {"张三", 18, 100};
    16. //地址传递
    17. printfStudent2(&stu);
    18. return 0;
    19. }

    注意:两者的最主要的区别是结构体指针作为函数参数时,如果函数内部修改了结构体内的数值,则会修改成员结构体的数据,而结构体变量则不会。废话少说,少说废话,直接上代码。

    1. #include
    2. using namespace std;
    3. //全局变量声明区
    4. //学生结构体定义
    5. struct Student
    6. {
    7. string name;
    8. int age;
    9. int score;
    10. };
    11. //函数声明
    12. void printfStudent(student stu);
    13. void printfStudent2(student* stu);
    14. int main()
    15. {
    16. Student stu = { "张三", 18, 100 };
    17. //值传递
    18. printfStudent(stu);
    19. cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
    20. cout << endl;
    21. //地址传递
    22. printfStudent2(&stu);
    23. cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
    24. return 0;
    25. }
    26. //值传递
    27. void printfStudent(student stu)
    28. {
    29. stu.age = 28;
    30. cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
    31. }
    32. //地址传递
    33. void printfStudent2(student* stu)
    34. {
    35. stu->age = 28;
    36. cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl;
    37. }

    以上代码唯一的区别就是函数传入的参数类型不同,一个结构体变量参数一个结构体指针变量参数,然后同样在函数中修改age的值并且结构体中age初始值都是18,一起看下运行结果:

    1. 开始运行...
    2. 子函数中 姓名:张三 年龄: 28 分数:100
    3. 主函数中 姓名:张三 年龄: 18 分数:100
    4. 子函数中 姓名:张三 年龄: 28 分数:100
    5. 主函数中 姓名:张三 年龄: 28 分数:100
    6. 运行结束。

    可以看到函数参数作为结构体指针进行地址传递修改数据时,student的age从18被修改为28了。

    5、结构体的嵌套

    定义完结构体后形成一个新的数据类型,c++中在定义结构体时可以声明其他已定义好的结构体变量,也可以在定义结构体时定义子结构体。

    5.1 在定义结构体中定义子结构体

    1. struct Student {
    2. struct StudentCar {
    3. string car_name;
    4. };
    5. //结构体内的变量和方法默认都是public的
    6. string name;
    7. int age;
    8. int score;
    9. //设置学生信息
    10. void setStuMsg(string name, int age, int score) {
    11. this->name = name;
    12. this->age = age;
    13. this->score = score;
    14. }
    15. //展示学生信息
    16. void showStuMsg() {
    17. cout << "name=" << name << ",age=" << age << ",score=" << score << endl;
    18. }
    19. };

    定义了一个名为Student结构体里面包含学生的姓名、年龄和分数,同时在Student里面定义了一个StudentCar的结构体,里面有car_name属性。然后看下这种结构体嵌套如何调用:

    1. int main() {
    2. Student::StudentCar we ;//声明结构体Student内部的结构体StudentCar的对象
    3. we.car_name = "bmw";//对car_name进行赋值操作
    4. cout << we.car_name << endl;//打印car_name的值
    5. Student stu;//声明外部Student的对象
    6. stu.setStuMsg("jack", 38, 88); //设置Student的属性值
    7. stu.showStuMsg();//调用自定义函数 打印结构体Student的值
    8. return 0;
    9. }
    10. //打印输出结果:
    11. bmw
    12. name=jack,age=38,score=88

    可以看到我们使用“::"引用到结构体内部的结构体变量进行操作。当然输了基本数据类型的访问,自定义的函数也是能访问的,操作也是一样的。

    5.2 在定义时声明其他已经定义好的结构体变量

    1. struct StudentCar {
    2. string car_name;
    3. };
    4. struct Student {
    5. StudentCar studentCar;
    6. //结构体内的变量和方法默认都是public的
    7. string name;
    8. int age;
    9. int score;
    10. //设置学生信息
    11. void setStuMsg(string name, int age, int score) {
    12. this->name = name;
    13. this->age = age;
    14. this->score = score;
    15. }
    16. //展示学生信息
    17. void showStuMsg() {
    18. cout << "name=" << name << ",age=" << age << ",score=" << score << endl;
    19. }
    20. };

    以上这种结构体嵌套的话就比较好理解了,把它当成基本数据类型调用使用就行了。先调用studentCar对象,再访问里面的属性,例如

    1. Student stu;
    2. stu.studentCar.car_name="benz";

    6、结构体数组

    结构体数组可以在定义结构体时声明,可以使用结构体变量声明,也可以直接声明结构体数组而无需定义结构体名。

    6.1 在定义结构体时直接声明

    1. struct Student {
    2. string name; //学生姓名
    3. int age; //学生年龄
    4. int score; //学生分数
    5. }student[5];

    6.2 在使用结构体变量声明

    1. struct Student {
    2. string name; //学生姓名
    3. int age; //学生年龄
    4. int score; //学生分数
    5. };
    6. Student student[2]= {
    7. {"tome", 67, 88},
    8. {"jerry", 86, 99},
    9. };

    6.3 直接声明结构体数组

    1. struct Student {
    2. string name; //学生姓名
    3. int age; //学生年龄
    4. int score; //学生分数
    5. } student[2] = {
    6. {"tome", 67, 88},
    7. {"jerry", 86, 99},
    8. };

  • 相关阅读:
    Flink SQL 时区 -- 时间字符串转时间戳并转换时区
    基于PHP+MySQL长途客用汽车票订票系统的设计与实现
    java计算机毕业设计水库洪水预报调度系统源码+系统+数据库+lw文档+mybatis+运行部署
    (附源码)计算机毕业设计JavaJava毕设项目租车网站
    反射和序列化操作会破坏单例模式
    postman接口测试工具详解
    两种方式获取Stream流的方式
    torch之从.datasets.CIFAR10解压出训练与测试图片 (附带网盘链接)
    2022夏暑假每日一题(六)
    fastjson解析出现引用问题
  • 原文地址:https://blog.csdn.net/csj731742019/article/details/126333378