结构体基本概念:

  结构体属于用户自定义的数据类型,允许用户存储不同的数据类型;

结构体定义和使用:

  语法:struct 结构体名 { 结构体成员列表 };

   通过结构体创建变量名的方式有三种:

          1、struct 结构体名 变量名

          2、struct 结构体名 变量名 = { 成员1值,成员2值...}

          3、定义结构体时顺便创建变量

   实例:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. //1、创建学生数据类型 : 学生包括(姓名、年龄、分数)
  6.  
  7. struct Student
  8. {
  9. //成员列表
  10. string name; //姓名
  11. int age; //年龄
  12. int score; //分数
  13. }s3; //顺便创建结构体变量


  14. //2、通过学生类型创建具体学生

  15. int main()
  16. {
  17.  
  18. //2.1 struct Student s1
  19. //struct 关键字 在C++中可以省略 相当于下行
  20. Student s1;//struct Student s1;
  21. //给s1赋值
  22. s1.name = "张三";
  23. s1.age = 18;
  24. s1.score = 100;
  25.  
  26. cout << "姓名:" << s1.name << " " << "年龄:" << s1.age << " " << "分数:" << s1.score << endl;
  27.  
  28. //2.2 struct Student s2 = {...}
  29.  
  30. struct Student s2 = { "李四",19,80 };
  31. cout << "姓名:" << s2.name << " " << "年龄:" << s2.age << " " << "分数:" << s2.score << endl;
  32.  
  33. //2.3 在定义结构体时顺便创建变量
  34. s3.name = "王五";
  35. s3.age = 30;
  36. s3.score = 60;
  37. cout << "姓名:" << s3.name << " " << "年龄:" << s3.age << " " << "分数:" << s3.score << endl;
  38.  
  39. system("pause");
  40. return 0;
  41. }

结构体数组:

作用:将自定义的结构体放入到数组中方便维护;

语法:struct 结构体名 数组名{元素个数} = { { },{ },......{ } }

实例:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. //结构体数组
  6. //1、定义结构体
  7.  
  8. struct Student
  9. {
  10. string name; //姓名
  11. int age; //年龄
  12. int score; //分数
  13. };
  14.  
  15. int main()
  16. {
  17. //2、创建结构体数组
  18. struct Student stuArray[3] =
  19. {
  20. {"张三",18,100},
  21. {"李四",28,99},
  22. {"王五",38,66}
  23. };
  24. //3、给结构体数组中的元素赋值
  25. stuArray[2].name = "赵六"; //将王五的信息改成赵六的
  26. stuArray[2].age = 80;
  27. stuArray[2].score = 60;
  28. //4、遍历结构体数组
  29. for (int i = 0; i < 3; i++)
  30. {
  31. cout << "姓名:" << stuArray[i].name << " "
  32. << "年龄:" << stuArray[i].age <<" "
  33. << "分数:" << stuArray[i].score << endl;
  34. }
  35. system("pause");
  36. return 0;
  37. }

结构体指针

作用:通过指针访问结构体中的成员;利用操作符 -> 可以通过结构体指针访问结构体属性。

实例:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. //结构体指针
  6. //1、定义学生结构体
  7.  
  8. struct Student
  9. {
  10. string name; //姓名
  11. int age; //年龄
  12. int score; //分数
  13. };
  14.  
  15. int main()
  16. {
  17. //2、创建学生结构体变量
  18. //struct Student s = {"张三",18,100}; //struct可以省略
  19. Student s = {"张三",18,100};
  20.  
  21. //3、通过指针指向结构体变量
  22. //int * p = &s; ->!!! 错误!!! <- 因为上行代码指定s是Student类型的,所以不能返回int型的数据,而应该返回Student型,即不能用int型的指针指向s;
  23.  
  24. //struct Student * p = &s; //struct可以省略
  25. Student * p = &s;
  26.  
  27. //4、通过指针访问结构体中的数据
  28. cout << "姓名:" << p->name <<" " << "年龄:" << p->age <<" " << "分数" << p->score <<endl;
  29.  
  30. system("pause");
  31. return 0;
  32. }

结构体嵌套结构体

作用:结构体中的成员可以是另一个结构体

例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

实例:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. //结构体嵌套结构体
  6.  
  7. //定义学生结构体
  8. struct Student
  9. {
  10. string name; //姓名
  11. int age; //年龄
  12. int score; //分数
  13. };
  14.  
  15. //定义老师结构体
  16. struct Teacher
  17. {
  18. int id; //教职工编号
  19. string name; //姓名
  20. int age; //年龄
  21. struct Student stu; //所带的学生
  22. };
  23.  
  24. int main()
  25. {
  26. Teacher t;
  27. t.id = 10000;
  28. t.name = "老王";
  29. t.age = 50;
  30. t.stu.name = "小王";
  31. t.stu.age = 20;
  32. t.stu.score = 60;
  33.  
  34. cout << "老师姓名:" << t.name <<" " << "老师编号:" << t.id << " " << "老师年龄:" << t.age << " "
  35. << "老师辅导的学生姓名:" << t.stu.name << " " << "学生分数:" << t.stu.score << " " << "学生年龄:" << t.stu.age << endl;
  36.  
  37. system("pause");
  38. return 0;
  39. }

结构体做函数参数

作用:将结构体作为参数向函数中传递

传递的方式有两种:1、值传递;2、地址传递;

实例:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. //结构体做函数参数
  6.  
  7. //定义学生结构体
  8. struct Student
  9. {
  10. string name; //姓名
  11. int age; //年龄
  12. int score; //分数
  13. };
  14.  
  15. //1、值传递
  16. void printStudent1(struct Student s)
  17. {
  18. cout << "子函数中通过值传递打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
  19. }
  20. //2、地址传递
  21. void printStudent2(struct Student * p)
  22. {
  23. cout << "子函数中通过地址传递打印 姓名:" << p->name << " " << "年龄:" << p->age << " " << "分数:" << p->score << endl;
  24. }
  25. int main()
  26. {
  27. //将学生传入到一个参数中,打印学生身上的所有信息
  28. struct Student s;
  29. s.name = "小王";
  30. s.age = 20;
  31. s.score = 99;
  32.  
  33. //cout << "main函数中打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
  34. //printStudent1(s);
  35. printStudent2(&s);
  36. system("pause");
  37. return 0;
  38. }

值传递和地址传递区别:

值传递:

  1. void printStudent1(struct Student s)
  2. {
  3. s.age = 100;
  4. cout << "子函数中通过值传递打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
  5. }
  6. int main()
  7. {
  8. struct Student s;
  9. s.name = "小王";
  10. s.age = 20;
  11. s.score = 99;
  12.  
  13. printStudent1(s);
  14. //printStudent2(&s);
  15. cout << "main函数中打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
  16.  
  17. system("pause");
  18. return 0;
  19. }

打印结果如下:

值传递中,形参()发生任何的改变,都不会修饰实参(),即形参的值发生改变,实参的值不会随着形参的值发生改变。

地址传递: 

  1. void printStudent2(struct Student * p)
  2. {
  3. p->age = 100;
  4. cout << "子函数中通过地址传递打印 姓名:" << p->name << " " << "年龄:" << p->age << " " << "分数:" << p->score << endl;
  5. }
  6. int main()
  7. {
  8. //将学生传入到一个参数中,打印学生身上的所有信息
  9. struct Student s;
  10. s.name = "小王";
  11. s.age = 20;
  12. s.score = 99;
  13.  
  14. //printStudent1(s);
  15. printStudent2(&s);
  16. cout << "main函数中打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
  17.  
  18. system("pause");
  19. return 0;
  20. }

打印结果为

地址传递的形参()会修饰实参();即形参值发生改变,实参也会随着改变。

结构体中const使用场景

作用:用const来防止误操作

实例:

  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4.  
  5. //const使用场景
  6.  
  7. struct Student
  8. {
  9. string name; //姓名
  10. int age; //年龄
  11. int score; //分数
  12. };
  13.  
  14. //void printStudents(Student s) //值传递会把形参的所有值(本例中的姓名、年龄、分数)复制一份,再传给实参,这样导致内存开销太大
  15. //void printStudents(Student *s) //将函数中的形参改为指针,可以减少内存空间的使用,减小内存开销,而不会像值传递一样复制一个新的副本出来 //加入const 就不能修改参数值了,只能读取 避免以后因为代码量太大而不小心误操作改值
  16. void printStudents(const Student* s) //加入const 就不能修改了,只能读取 避免以后因为代码量太大而不小心误操作改值
  17. {
  18. /*
  19. //s.age = 150;
  20. //cout << "姓名:" << s.name << " " << "年龄:" << s.age << " " << "分数:" << s.score << endl;
  21. */
  22.  
  23. // s->age = 150; //加入const 就不能修改参数了,否则运行会报错:表达式必须是可修改的左值!以此用来限定用户误操作
  24. cout << "姓名:" << s->name << " " << "年龄:" << s->age << " " << "分数:" << s->score << endl;
  25. }
  26. int main()
  27. {
  28. //创建结构体变量
  29. struct Student s = { "张三",20,90 };
  30.  
  31. //通过函数打印结构体变量信息
  32. //printStudents(s); //值传递内存开销太大
  33. printStudents(&s); //采用地址传递,每次只占用4个字节(指针内存大小为4字节),减小内存开销
  34.  
  35. cout << "张三的年龄为:" << s.age << endl;
  36.  
  37. system("pause");
  38. return 0;
  39. }

C++学习 3 结构体的更多相关文章

  1. C语言学习之结构体

    前言 一直以来,C语言的学习都在入门阶段,只用到数组.函数.循环.选择.位运算这些基本的知识,较少用到指针.预处理.结构体.枚举类型.文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言 ...

  2. c语言学习笔记 - 结构体位域

    在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...

  3. C语言学习1——结构体剖析

    一、定义结构体变量的方法 1.1先声明结构体类型在定义变量名 例如: a.声明结构体类型 struct student { int num; char name[20]; char sex; int ...

  4. C语言学习笔记--结构体

    结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...

  5. C学习之结构体

    结构体(struct) 结构体是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合,结构体中可以使用不同的数据类型. 1. 结构体说明和结构体变量定义 在Turbo C中, 结构体也是一种数据 ...

  6. SNMP学习之结构体snmp_secmod_def

    此结构体中定义了各个回调函数,在函数init_ksm(E:\code\net-snmp-5.4.2.1\snmplib)中进行了初始化. void init_ksm(void) { struct sn ...

  7. 【CUDA学习】结构体指针复制

    内核函数中要用data结构作用参数 typedef struct { int* value; int* num; } data; //host端 data* h_input; h_input=(dat ...

  8. go学习笔记-结构体

    结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...

  9. iOS开发-Object-C学习之结构体使用

    前言:定义结构体并不是定义一个变量,而是定义了种数据类型. 结构体作用: 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实 ...

  10. libevent源码学习_event结构体

    在libevent中最重要的结构体莫过于event和event_base了,下面对于这2个结构体进行分析. 1.结构体event,位于:event.h struct event { /* * 双向链表 ...

随机推荐

  1. Python - 面向对象编程 - @property

    前言 前面讲到实例属性的时候,我们可以通过 实例对象.实例属性 来访问对应的实例属性 但这种做法是不建议的,因为它破坏了类的封装原则 正常情况下,实例属性应该是隐藏的,只允许通过类提供的方法来间接实现 ...

  2. linux上安装Docker (非常简单的安装方法) 2019

    Docker的三大核心概念:镜像.容器.仓库 镜像:类似虚拟机的镜像.用俗话说就是安装文件. 容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例, 可以将其启动.开始.停止.删除.而这些容器都是 ...

  3. SpringBoot笔记(7)

    一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...

  4. git clone 设置临时的 proxy

    export ALL_PROXY=socks5://127.0.0.1:1086 git clone --depth 1 https://github.com/xxx/xxx.git unset AL ...

  5. IDEA使用教程+JRebel破解

    下载与安装 https://www.jetbrains.com 不装任何插件 破解码 K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZW ...

  6. java线程池-工作队列workQueue

    线程池之工作队列 ArrayBlockingQueue 采用数组来实现,并采用可重入锁ReentrantLock来做并发控制,无论是添加还是读取,都先要获得锁才能进行操作 可看出进行读写操作都使用了R ...

  7. 【linux】 linux超实用命令整理

    linux实用命令整理 由于开发过程中经常接触linux系统进行各种情况下的操作,故开此博客整理生产环境下操作命令集,温故而知新. 系统命令 快捷键操作命令 1.tab //命令或路径等的补全键,li ...

  8. web、html概念快速入门

    1.C/S和B/S 总结,理论上如果硬件不考虑(带宽.(图像资源加载)显卡等),B/S可以完全替代C/S: 2.静态资源和动态资源 其中,访问时动态资源,服务器后台也会通过视图解析器转换成静态资源,因 ...

  9. Linux学习笔记--终端命令

    ~ 表示用户目录路径 ls   显示当前目录下的文件或目录 -l 列出文件纤细信息l(list) -a 列出当前目录下所有文件及目录, 包含隐藏的a(all) mkdir   创建目录 -p 创建目录 ...

  10. 【第二篇】- Git 安装配置之Spring Cloud直播商城 b2b2c电子商务技术总结

    Git 安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://g ...