8 结构体

8.1 结构体基本概念

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

8.2 结构体定义和使用

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

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

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值 , 成员2值…}
  • 定义结构体时顺便创建变量

示例:

//结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
}stu3; //结构体变量创建方式3 int main() { //结构体变量创建方式1
struct student stu1; //struct 关键字可以省略 stu1.name = "张三";
stu1.age = 18;
stu1.score = 100; cout << "姓名:" << stu1.name << " 年龄:" << stu1.age << " 分数:" << stu1.score << endl; //结构体变量创建方式2
struct student stu2 = { "李四",19,60 }; cout << "姓名:" << stu2.name << " 年龄:" << stu2.age << " 分数:" << stu2.score << endl; stu3.name = "王五";
stu3.age = 18;
stu3.score = 80; cout << "姓名:" << stu3.name << " 年龄:" << stu3.age << " 分数:" << stu3.score << endl; system("pause"); return 0;
}

总结1:定义结构体时的关键字是struct,不可省略

总结2:创建结构体变量时,关键字struct可以省略

总结3:结构体变量利用操作符 ‘’.’’ 访问成员

8.3 结构体数组

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

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

示例:

//结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
} int main() { //结构体数组
struct student arr[3]=
{
{"张三",18,80 },
{"李四",19,60 },
{"王五",20,70 }
}; for (int i = 0; i < 3; i++)
{
cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数:" << arr[i].score << endl;
} system("pause"); return 0;
}

8.4 结构体指针

**作用:**通过指针访问结构体中的成员

  • 利用操作符 ->可以通过结构体指针访问结构体属性

示例:

//结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
}; int main() { struct student stu = { "张三",18,100, }; struct student * p = &stu; p->score = 80; //指针通过 -> 操作符可以访问成员 cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl; system("pause"); return 0;
}

总结:结构体指针可以通过 -> 操作符 来访问结构体中的成员

8.5 结构体嵌套结构体

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

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

示例:

//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
}; //教师结构体定义
struct teacher
{
//成员列表
int id; //职工编号
string name; //教师姓名
int age; //教师年龄
struct student stu; //子结构体 学生
}; int main() { struct teacher t1;
t1.id = 10000;
t1.name = "老王";
t1.age = 40; t1.stu.name = "张三";
t1.stu.age = 18;
t1.stu.score = 100; cout << "教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl; cout << "辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl; system("pause"); return 0;
}

**总结:**在结构体中可以定义另一个结构体作为成员,用来解决实际问题

8.6 结构体做函数参数

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

传递方式有两种:

  • 值传递
  • 地址传递

示例:

//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
}; //值传递
void printStudent(student stu )
{
stu.age = 28;
cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
} //地址传递
void printStudent2(student *stu)
{
stu->age = 28;
cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl;
} int main() { student stu = { "张三",18,100};
//值传递
printStudent(stu);
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl; cout << endl; //地址传递
printStudent2(&stu);
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl; system("pause"); return 0;
}

总结:如果不想修改主函数中的数据,用值传递,反之用地址传递

8.7 结构体中 const使用场景

**作用:**用const来防止误操作

示例:

//学生结构体定义
struct student
{
//成员列表
string name; //姓名
int age; //年龄
int score; //分数
}; //const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
//stu->age = 100; //操作失败,因为加了const修饰
cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl; } int main() { student stu = { "张三",18,100 }; printStudent(&stu); system("pause"); return 0;
}

8.8 结构体案例

8.8.1 案例1

案例描述:

学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下

设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员

学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值

最终打印出老师数据以及老师所带的学生数据。

示例:

struct Student
{
string name;
int score;
};
struct Teacher
{
string name;
Student sArray[5];
}; void allocateSpace(Teacher tArray[] , int len)
{
string tName = "教师";
string sName = "学生";
string nameSeed = "ABCDE";
for (int i = 0; i < len; i++)
{
tArray[i].name = tName + nameSeed[i]; for (int j = 0; j < 5; j++)
{
tArray[i].sArray[j].name = sName + nameSeed[j];
tArray[i].sArray[j].score = rand() % 61 + 40;
}
}
} void printTeachers(Teacher tArray[], int len)
{
for (int i = 0; i < len; i++)
{
cout << tArray[i].name << endl;
for (int j = 0; j < 5; j++)
{
cout << "\t姓名:" << tArray[i].sArray[j].name << " 分数:" << tArray[i].sArray[j].score << endl;
}
}
} int main() { srand((unsigned int)time(NULL)); //随机数种子 头文件 #include <ctime> Teacher tArray[3]; //老师数组 int len = sizeof(tArray) / sizeof(Teacher); allocateSpace(tArray, len); //创建数据 printTeachers(tArray, len); //打印数据 system("pause"); return 0;
}

8.8.2 案例2

案例描述:

设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。

通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。

五名英雄信息如下:

		{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"},

示例:

//英雄结构体
struct hero
{
string name;
int age;
string sex;
};
//冒泡排序
void bubbleSort(hero arr[] , int len)
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j].age > arr[j + 1].age)
{
hero temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//打印数组
void printHeros(hero arr[], int len)
{
for (int i = 0; i < len; i++)
{
cout << "姓名: " << arr[i].name << " 性别: " << arr[i].sex << " 年龄: " << arr[i].age << endl;
}
} int main() { struct hero arr[5] =
{
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"},
}; int len = sizeof(arr) / sizeof(hero); //获取数组元素个数 bubbleSort(arr, len); //排序 printHeros(arr, len); //打印 system("pause"); return 0;
}

更多信息请关注公众号:

[C++基础入门] 8、结构体的更多相关文章

  1. 黑马程序员——C语言基础 变量类型 结构体

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)变量类型 1)局部变量 1> 定义:在函数内部定义的变量,称为 ...

  2. Swift入门篇-结构体

    前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...

  3. 12、C#基础整理(结构体)

    结构体 1.概念: 结构体是写在main函数外的数据结构,由不同类型的数据组合成一个整体,这些组合在一个整体中的数据是互相联系的 2.声明方式: struct 结构体名 { 成员变量(由类型名+成员名 ...

  4. Delphi基础Write写入结构体到文件(使用 file of myrecord就行了,真简单)

    program WriteStruct; {$APPTYPE CONSOLE} uses SysUtils; //写入结构体 type TCustomer = record ID: ]; Code: ...

  5. c++入门之结构体初步

    结构体实际上是一种数据结构的雏形,对结构体的灵活使用很多时候可以带来很多便利.下面给出一个关于结构体的程序: #include "iostream" # include " ...

  6. 张超超OC基础回顾03_结构体类型作为成员变量的特殊用法

    直接上例子: 要求: 合理的设计一个”学生“类 学生有* 姓名* 生日两个属性和说出自己姓名生日方法  要求利用设计的学生类创建学生对象,并说出自己的姓名和年龄 描述学生类 事物名称: 学生(Stud ...

  7. C# 基础之类与结构体的区别

    1.语法上的区别是: 定义类使用关键字class,定义结构体用关键字struct 2.结构体中不可对声明字段进行初始化,但类可以 3. 类:如果没有为类显示的定义一个构造函数,c#编译器会自动生成一个 ...

  8. golang | Go语言入门教程——结构体初始化与继承

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...

  9. (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作

    Linux 目录结构及文件基本操作 介绍 1.Linux 的文件组织目录结构. 2.相对路径和绝对路径. 3.对文件的移动.复制.重命名.编辑等操作. 一.Linux 目录结构 在讲 Linux 目录 ...

  10. Linux基础入门-目录结构及文件基本操作

    一.Linux的目录结构: Windows是以存储介质为主的,主要以盘符及分区来实现文件的管理,然后之下才是目录.但Linux的磁盘从逻辑上来说是挂载在目录上的,每个目录不仅能使用本地磁盘分区的文件系 ...

随机推荐

  1. APK 跳转其他APK

    +import android.content.ComponentName;^M /* @@ -343,6 +346,15 @@ public class MainActivity extends A ...

  2. 每日一道算法题——斐波那契数列Fibonacci

    题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1),n≤39: 示例1 输入: 4 返回值: 3 代码: 方法一:递归 publi ...

  3. eclipse微服务续,Hystrix+Gateway+Config配置管理中心+Bus动态刷新配置

    Hystrix延迟和容错库 Gateway微服务网关 Config配置管理中心 Bus动态刷新配置 四.Hystrix延迟和容错库 SpringCloud默认已为Feign整合了hystrix,所以添 ...

  4. git 本地项目初始化提交至仓库

    命令行指令 Git初始化配置 git config --global user.name"abc" git config --global user.email"1234 ...

  5. 关于Unity 图片队列存储以及出列导致内存溢出的解决方案

    图片虽然出列但是并没有销毁,所以..destroy !  

  6. spring事务不生效8种原因

    1.数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB. 根据 MySQL 的官方文档: ...

  7. Python学习笔记--SQL数据

    SQL 本人受到Java的影响,数据库的话,就不按照教程走了,我就直接使用的是Navicat软件的数据库啦! SQL支持注释: 两种单行注释(-- 和# ),和一种多行注释(/* */) 基础的使用语 ...

  8. 【SpringBoot】还不会SpringBoot项目模块分层?来这手把手教你

    前言 缘由 经常看到网上很多优秀的开源项目中,代码简洁,模块分层完美.反观自己代码层级混乱,,却不知如何整理分层.此文手把手教你一步一步创建模块,左手右手一个慢动作.结合本人实际开发及个人项目中分层思 ...

  9. 思必驰周强:AI 和传统信号技术在实时音频通话中的应用

    如何用 AI 解决声音传输&处理中的三大问题?三大问题又是哪三大问题? 在「RTE2022 实时互联网大会」中,思必驰研发总监 @周强以<AI 和传统信号技术在实时音频通话中的应用> ...

  10. [WEB13] ctf.show_web13

    [WEB13] ctf.show_web13 .user.ini绕过 文件上传的要求: 文件的大小要小于24,并且对名字的,后缀的长度都有要求,后缀和名字都不可以包含php的情况下,需要上传一句话木马 ...