c++之结构体
时间:2022-07-23
本文章向大家介绍c++之结构体,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、结构体定义
结构体属于用户自定义的类型,允许用户存储不同的数据类型。
语法:struct 结构体名{结构体成员列表};
通过结构体创建变量有三种方式:
- struct 结构体名 变量名
- struct 结构体名 变量名={成员1值,成员2值...}
- 定义结构体时顺便创建变量
一般使用前两种,因为第三种在定义时创建的变量容易被人所忽略。
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
}s3;
int main() {
//创建的时候struct关键字可以省略
struct Student s1;
s1.name = "tom";
s1.age = 12;
s1.score = 99;
cout << "name:" << s1.name << "age:" << s1.age << "score:" << s1.score << endl;
struct Student s2 ={"jack", 15, 98};
s3.name = "bob";
s3.age = 19;
s3.score = 97;
system("pause");
return 0;
}
二、结构体数组
作用:将自定义的结构体放入到数组中方便维护。
语法:struct 结构体名 数组名[元素个数] = {{},{},...{}}
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
};
int main() {
//结构体数组定义
struct Student stuArr[3]
{
{ "tom", 19, 99},
{ "jack",15, 98},
{ "bob", 22, 97 },
};
//可以修改值或者在这里进行赋值
stuArr[2].name = "mike";
//获取数组的长度
int length = sizeof(stuArr) / sizeof(stuArr[0]);
//遍历数组
for (int i = 0; i < length; i++) {
cout << stuArr[i].name << stuArr[i].age << stuArr[i].score << endl;
}
system("pause");
return 0;
}
三、结构体指针
作用:通过指针来访问结构体中的成员
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
};
int main() {
struct Student s = { "tom",12,99 };
Student* p = &s;
//需要使用->来访问
cout << p->name << p->age << p->score << endl;
system("pause");
return 0;
}
四、结构体嵌套结构体
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
};
struct Teacher {
int id;
string name;
int age;
Student stu;
};
int main() {
struct Teacher t;
t.id = 1;
t.name = "joke";
t.age = 45;
struct Student stu = { "tom",12,99 };
t.stu = stu;
cout << t.id << t.name << t.age << t.stu.name << t.stu.age << t.stu.score << endl;
system("pause");
return 0;
}
五。结构体做函数参数
作用:将结构体作为参数向函数传递。
传递方式有两种:值传递、引用传递。
值传递:
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
};
//值传递
void printStudent(Student stu) {
stu.name = "jack";
stu.age = 22;
stu.score = 90;
cout << "结构体中的stu信息:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score << endl;
}
int main() {
struct Student stu = { "tom",12,99 };
cout << "未传入函数之前的结构体值:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score << endl;
printStudent(stu);
cout << "传入函数之后的结构体值:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score<< endl;
system("pause");
return 0;
}
输出:
引用传递:
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
};
//值传递
void printStudent(Student* stu) {
stu->name = "jack";
stu->age = 22;
stu->score = 90;
cout << "结构体中的stu信息:" << endl;
cout << stu->name << "," << stu->age << "," << stu->score << endl;
}
int main() {
struct Student stu = { "tom",12,99 };
struct Student* p = &stu;
cout << "未传入函数之前的结构体值:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score << endl;
printStudent(p);
cout << "传入函数之后的结构体值:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score << endl;
system("pause");
return 0;
}
输出:
六、结构体中const的使用场景
作用:用const防止误操作
#include <iostream>
using namespace std;
struct Student {
string name;
int age;
float score;
};
//值传递
void printStudent(const Student* stu) {
/*这里就不能进行修改了
stu->name = "jack";
stu->age = 22;
stu->score = 90;
*/
cout << "结构体中的stu信息:" << endl;
cout << stu->name << "," << stu->age << "," << stu->score << endl;
}
int main() {
struct Student stu = { "tom",12,99 };
struct Student* p = &stu;
cout << "未传入函数之前的结构体值:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score << endl;
printStudent(p);
cout << "传入函数之后的结构体值:" << endl;
cout << stu.name << "," << stu.age << "," << stu.score << endl;
system("pause");
return 0;
}
输出:
只需要记住,用const修饰的数据类型就不能再进行更改。
- 有趣的算法(一)——n阶层尾部有几个0
- Singal Page App:使用Knockout和RequireJS创建高度模块化的单页应用引擎背景知识文档结构服务端API准备Require配置与系统配置模块中的工作模块间的工作烂图赏鉴代码送上
- Canvas 图片绕边旋转的小动画
- 探寻ASP.NET MVC鲜为人知的奥秘(3):寻找多语言的最佳实践方式
- 探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终
- Canvas 剪切图片
- 探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持
- Canvas 图片平铺设置
- Canvas 给图形绘制阴影
- State模式的经典应用场景:订单处理(c#实现)场景描述遇到问题解决问题走起
- ASP.NET SignalR 2.0入门指南介绍SignalRSignalR和WebSocket传输和回滚HTML5 传输协议Comet transports传输协议选择过程监测传输指定传输协议连接
- ASP.NET5之客户端开发:Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用Grunt和Gulp使用Grunt准备项目配置NPM配置Grunt集成起来监测文件变化与V
- 有趣的算法(三)——Hash算法
- JavaScript中的数据类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring security 使用自定义AuthenticationFailureHandler无法跳转failureUrl
- Android studio 下载安装教程和第一个程序运行最新,多图详解
- ubuntu16.04下qt5.14报错:/home/zhangfakai/Qt5.14.1/5.14.1/gcc_64/include/QtGui/qopengl.h:141: error: GL/
- 每天手撕一道算法-64. 最小路径和
- 每日手撕一道算法题-322.零钱兑换
- 每天手撕一道算法题-130. 被围绕的区域
- TKE上部署metrics-server
- Docker-Compose搭建mysql、redis、zookeeper、rabbitmq、consul、elasticsearch环境
- MDK更改配色方案
- Apache通过多端口配置多站点
- FatFs-目录下文件扫描
- Python之Bilibili自动更新邮件提醒并任务栏图标「完整代码」
- STC15频率产生器(粗调+微调+数码管显示)完整代码
- PID算法原理、调整规律及代码
- GIT——分布式版本控制系统