C++学习 3 结构体
结构体基本概念:
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型;
结构体定义和使用:
语法:struct 结构体名 { 结构体成员列表 };
通过结构体创建变量名的方式有三种:
1、struct 结构体名 变量名
2、struct 结构体名 变量名 = { 成员1值,成员2值...}
3、定义结构体时顺便创建变量
实例:
- #include<iostream>
- #include<string>
- using namespace std;
- //1、创建学生数据类型 : 学生包括(姓名、年龄、分数)
- struct Student
- {
- //成员列表
- string name; //姓名
- int age; //年龄
- int score; //分数
- }s3; //顺便创建结构体变量
- //2、通过学生类型创建具体学生
- int main()
- {
- //2.1 struct Student s1
- //struct 关键字 在C++中可以省略 相当于下行
- Student s1;//struct Student s1;
- //给s1赋值
- s1.name = "张三";
- s1.age = 18;
- s1.score = 100;
- cout << "姓名:" << s1.name << " " << "年龄:" << s1.age << " " << "分数:" << s1.score << endl;
- //2.2 struct Student s2 = {...}
- struct Student s2 = { "李四",19,80 };
- cout << "姓名:" << s2.name << " " << "年龄:" << s2.age << " " << "分数:" << s2.score << endl;
- //2.3 在定义结构体时顺便创建变量
- s3.name = "王五";
- s3.age = 30;
- s3.score = 60;
- cout << "姓名:" << s3.name << " " << "年龄:" << s3.age << " " << "分数:" << s3.score << endl;
- system("pause");
- return 0;
- }
结构体数组:
作用:将自定义的结构体放入到数组中方便维护;
语法:struct 结构体名 数组名{元素个数} = { { },{ },......{ } }
实例:
- #include<iostream>
- #include<string>
- using namespace std;
- //结构体数组
- //1、定义结构体
- struct Student
- {
- string name; //姓名
- int age; //年龄
- int score; //分数
- };
- int main()
- {
- //2、创建结构体数组
- struct Student stuArray[3] =
- {
- {"张三",18,100},
- {"李四",28,99},
- {"王五",38,66}
- };
- //3、给结构体数组中的元素赋值
- stuArray[2].name = "赵六"; //将王五的信息改成赵六的
- stuArray[2].age = 80;
- stuArray[2].score = 60;
- //4、遍历结构体数组
- for (int i = 0; i < 3; i++)
- {
- cout << "姓名:" << stuArray[i].name << " "
- << "年龄:" << stuArray[i].age <<" "
- << "分数:" << stuArray[i].score << endl;
- }
- system("pause");
- return 0;
- }
结构体指针
作用:通过指针访问结构体中的成员;利用操作符 -> 可以通过结构体指针访问结构体属性。
实例:
- #include<iostream>
- #include<string>
- using namespace std;
- //结构体指针
- //1、定义学生结构体
- struct Student
- {
- string name; //姓名
- int age; //年龄
- int score; //分数
- };
- int main()
- {
- //2、创建学生结构体变量
- //struct Student s = {"张三",18,100}; //struct可以省略
- Student s = {"张三",18,100};
- //3、通过指针指向结构体变量
- //int * p = &s; ->!!! 错误!!! <- 因为上行代码指定s是Student类型的,所以不能返回int型的数据,而应该返回Student型,即不能用int型的指针指向s;
- //struct Student * p = &s; //struct可以省略
- Student * p = &s;
- //4、通过指针访问结构体中的数据
- cout << "姓名:" << p->name <<" " << "年龄:" << p->age <<" " << "分数" << p->score <<endl;
- system("pause");
- return 0;
- }
结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
实例:
- #include<iostream>
- #include<string>
- using namespace std;
- //结构体嵌套结构体
- //定义学生结构体
- struct Student
- {
- string name; //姓名
- int age; //年龄
- int score; //分数
- };
- //定义老师结构体
- struct Teacher
- {
- int id; //教职工编号
- string name; //姓名
- int age; //年龄
- struct Student stu; //所带的学生
- };
- int main()
- {
- Teacher t;
- t.id = 10000;
- t.name = "老王";
- t.age = 50;
- t.stu.name = "小王";
- t.stu.age = 20;
- t.stu.score = 60;
- cout << "老师姓名:" << t.name <<" " << "老师编号:" << t.id << " " << "老师年龄:" << t.age << " "
- << "老师辅导的学生姓名:" << t.stu.name << " " << "学生分数:" << t.stu.score << " " << "学生年龄:" << t.stu.age << endl;
- system("pause");
- return 0;
- }
结构体做函数参数
作用:将结构体作为参数向函数中传递
传递的方式有两种:1、值传递;2、地址传递;
实例:
- #include<iostream>
- #include<string>
- using namespace std;
- //结构体做函数参数
- //定义学生结构体
- struct Student
- {
- string name; //姓名
- int age; //年龄
- int score; //分数
- };
- //1、值传递
- void printStudent1(struct Student s)
- {
- cout << "子函数中通过值传递打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
- }
- //2、地址传递
- void printStudent2(struct Student * p)
- {
- cout << "子函数中通过地址传递打印 姓名:" << p->name << " " << "年龄:" << p->age << " " << "分数:" << p->score << endl;
- }
- int main()
- {
- //将学生传入到一个参数中,打印学生身上的所有信息
- struct Student s;
- s.name = "小王";
- s.age = 20;
- s.score = 99;
- //cout << "main函数中打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
- //printStudent1(s);
- printStudent2(&s);
- system("pause");
- return 0;
- }
值传递和地址传递区别:
值传递:
- void printStudent1(struct Student s)
- {
- s.age = 100;
- cout << "子函数中通过值传递打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
- }
- int main()
- {
- struct Student s;
- s.name = "小王";
- s.age = 20;
- s.score = 99;
- printStudent1(s);
- //printStudent2(&s);
- cout << "main函数中打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
- system("pause");
- return 0;
- }
打印结果如下:
值传递中,形参()发生任何的改变,都不会修饰实参(
),即形参的值发生改变,实参的值不会随着形参的值发生改变。
地址传递:
- void printStudent2(struct Student * p)
- {
- p->age = 100;
- cout << "子函数中通过地址传递打印 姓名:" << p->name << " " << "年龄:" << p->age << " " << "分数:" << p->score << endl;
- }
- int main()
- {
- //将学生传入到一个参数中,打印学生身上的所有信息
- struct Student s;
- s.name = "小王";
- s.age = 20;
- s.score = 99;
- //printStudent1(s);
- printStudent2(&s);
- cout << "main函数中打印 姓名:" << s.name <<" " << "年龄:" << s.age <<" " << "分数:" << s.score << endl;
- system("pause");
- return 0;
- }
打印结果为
地址传递的形参()会修饰实参(
);即形参值发生改变,实参也会随着改变。
结构体中const使用场景
作用:用const来防止误操作
实例:
- #include<iostream>
- #include<string>
- using namespace std;
- //const使用场景
- struct Student
- {
- string name; //姓名
- int age; //年龄
- int score; //分数
- };
- //void printStudents(Student s) //值传递会把形参的所有值(本例中的姓名、年龄、分数)复制一份,再传给实参,这样导致内存开销太大
- //void printStudents(Student *s) //将函数中的形参改为指针,可以减少内存空间的使用,减小内存开销,而不会像值传递一样复制一个新的副本出来 //加入const 就不能修改参数值了,只能读取 避免以后因为代码量太大而不小心误操作改值
- void printStudents(const Student* s) //加入const 就不能修改了,只能读取 避免以后因为代码量太大而不小心误操作改值
- {
- /*
- //s.age = 150;
- //cout << "姓名:" << s.name << " " << "年龄:" << s.age << " " << "分数:" << s.score << endl;
- */
- // s->age = 150; //加入const 就不能修改参数了,否则运行会报错:表达式必须是可修改的左值!以此用来限定用户误操作
- cout << "姓名:" << s->name << " " << "年龄:" << s->age << " " << "分数:" << s->score << endl;
- }
- int main()
- {
- //创建结构体变量
- struct Student s = { "张三",20,90 };
- //通过函数打印结构体变量信息
- //printStudents(s); //值传递内存开销太大
- printStudents(&s); //采用地址传递,每次只占用4个字节(指针内存大小为4字节),减小内存开销
- cout << "张三的年龄为:" << s.age << endl;
- system("pause");
- return 0;
- }
C++学习 3 结构体的更多相关文章
- C语言学习之结构体
前言 一直以来,C语言的学习都在入门阶段,只用到数组.函数.循环.选择.位运算这些基本的知识,较少用到指针.预处理.结构体.枚举类型.文件操作等这些C语言的精髓内容,现在想想真不敢说自己熟练掌握C语言 ...
- c语言学习笔记 - 结构体位域
在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...
- C语言学习1——结构体剖析
一、定义结构体变量的方法 1.1先声明结构体类型在定义变量名 例如: a.声明结构体类型 struct student { int num; char name[20]; char sex; int ...
- C语言学习笔记--结构体
结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...
- C学习之结构体
结构体(struct) 结构体是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合,结构体中可以使用不同的数据类型. 1. 结构体说明和结构体变量定义 在Turbo C中, 结构体也是一种数据 ...
- SNMP学习之结构体snmp_secmod_def
此结构体中定义了各个回调函数,在函数init_ksm(E:\code\net-snmp-5.4.2.1\snmplib)中进行了初始化. void init_ksm(void) { struct sn ...
- 【CUDA学习】结构体指针复制
内核函数中要用data结构作用参数 typedef struct { int* value; int* num; } data; //host端 data* h_input; h_input=(dat ...
- go学习笔记-结构体
结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...
- iOS开发-Object-C学习之结构体使用
前言:定义结构体并不是定义一个变量,而是定义了种数据类型. 结构体作用: 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实 ...
- libevent源码学习_event结构体
在libevent中最重要的结构体莫过于event和event_base了,下面对于这2个结构体进行分析. 1.结构体event,位于:event.h struct event { /* * 双向链表 ...
随机推荐
- Python - 面向对象编程 - @property
前言 前面讲到实例属性的时候,我们可以通过 实例对象.实例属性 来访问对应的实例属性 但这种做法是不建议的,因为它破坏了类的封装原则 正常情况下,实例属性应该是隐藏的,只允许通过类提供的方法来间接实现 ...
- linux上安装Docker (非常简单的安装方法) 2019
Docker的三大核心概念:镜像.容器.仓库 镜像:类似虚拟机的镜像.用俗话说就是安装文件. 容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例, 可以将其启动.开始.停止.删除.而这些容器都是 ...
- SpringBoot笔记(7)
一.单元测试 1.JUnit5简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不 ...
- git clone 设置临时的 proxy
export ALL_PROXY=socks5://127.0.0.1:1086 git clone --depth 1 https://github.com/xxx/xxx.git unset AL ...
- IDEA使用教程+JRebel破解
下载与安装 https://www.jetbrains.com 不装任何插件 破解码 K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZW ...
- java线程池-工作队列workQueue
线程池之工作队列 ArrayBlockingQueue 采用数组来实现,并采用可重入锁ReentrantLock来做并发控制,无论是添加还是读取,都先要获得锁才能进行操作 可看出进行读写操作都使用了R ...
- 【linux】 linux超实用命令整理
linux实用命令整理 由于开发过程中经常接触linux系统进行各种情况下的操作,故开此博客整理生产环境下操作命令集,温故而知新. 系统命令 快捷键操作命令 1.tab //命令或路径等的补全键,li ...
- web、html概念快速入门
1.C/S和B/S 总结,理论上如果硬件不考虑(带宽.(图像资源加载)显卡等),B/S可以完全替代C/S: 2.静态资源和动态资源 其中,访问时动态资源,服务器后台也会通过视图解析器转换成静态资源,因 ...
- Linux学习笔记--终端命令
~ 表示用户目录路径 ls 显示当前目录下的文件或目录 -l 列出文件纤细信息l(list) -a 列出当前目录下所有文件及目录, 包含隐藏的a(all) mkdir 创建目录 -p 创建目录 ...
- 【第二篇】- Git 安装配置之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 安装配置 在使用Git前我们需要先安装 Git.Git 目前支持 Linux/Unix.Solaris.Mac和 Windows 平台上运行. Git 各平台安装包下载地址为:http://g ...