一、结构体嵌套结构体

结构体内的成员可以是另一个结构体(访问时用.访问到不能访问为止)

1、例如:每个老师指导一个学员,一个老师的结构体中嵌套一个学生的结构体

#include<iostream>
using namespace std;
#include<string>
//结构体嵌套结构体//1、定义结构体(先告诉系统有这样一个数据类型)
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 = 18;t.stu.score = 100;cout << "老师姓名:" << t.name << " " << "老师职工编号:" << t.id << " " << "老师的年龄:" << t.age << endl;cout << "老师辅导的学生姓名:" << t.stu.name << " " << "学生的年龄:" << t.stu.age << " " << "学生的分数:" << t.stu.score << endl;
}

二、结构体作为函数参数

1、作用:结构体作为参数向函数传递

2、传递方式:值传递(形参改变,实参不改变),地址传递(实参随着形参的改变而改变)

因为值传递时相当于在给形参开辟一段内存空间并将实参的复制进去,对于形参变量的操作在形参内存空间中进行。但是地址传递形参开辟的空间传入的是实参的地址,对于形参变量的操作会通过地址访问到实参的内存空间,所以实参跟着改变。

1)

#include<iostream>
using namespace std;
#include<string>
//结构体做函数的参数
//将学生传入到一个函数中,打印学生的信息//1、定义结构体(先告诉系统有这样一个数据类型)
struct student
{string name;int age;int score;
};
//3、定义打印函数
void printfunction(student s)
{cout << s.name << " " << s.age << " " << s.score << endl;
}int main()
{//2、创建结构体变量student s1 = { "张三",24,100 };printfunction(s1);//调用函数}

2)指针用箭头访问属性

#include<iostream>
using namespace std;
#include<string>
//结构体做函数的参数
//将学生传入到一个函数中,打印学生的信息//1、定义结构体(先告诉系统有这样一个数据类型)
struct student
{string name;int age;int score;
};
//3、定义打印函数
void printfunction(student *p1)
{cout << p1->name << " " << p1->age << " " << p1->score << endl;
}int main()
{//2、创建结构体变量student s1 = { "张三",24,100 };student* p = &s1;printfunction(p);//调用函数}

值传递和地址传递区别:

值传递时在,在子函数中改变属性(也就是改变了形参),不会改变主函数中的实参的输出。

#include<iostream>
using namespace std;
#include<string>
//结构体做函数的参数
//将学生传入到一个函数中,打印学生的信息//1、定义结构体(先告诉系统有这样一个数据类型)
struct student
{string name;int age;int score;
};
//3、定义打印函数
void printfunction(student s)
{s.age = 100;cout <<"值传递子函数中:"<< s.name << " " << s.age << " " << s.score << endl;//cout << p1->name << " " << p1->age << " " << p1->score << endl;
}int main()
{//2、创建结构体变量student s1 = { "张三",24,100 };//student* p = &s1;printfunction(s1);//调用函数cout<<"main函数中:"<< s1.name << " " << s1.age << " " << s1.score << endl;
}

地址传递时,实参随着形参的改变而改变

#include<iostream>
using namespace std;
#include<string>
//结构体做函数的参数
//将学生传入到一个函数中,打印学生的信息//1、定义结构体(先告诉系统有这样一个数据类型)
struct student
{string name;int age;int score;
};
//3、定义打印函数
void printfunction(student *p1)
{p1->age = 100;//cout <<"值传递子函数中:"<< s.name << " " << s.age << " " << s.score << endl;cout <<"地址传递时:"<< p1->name << " " << p1->age << " " << p1->score << endl;
}int main()
{//2、创建结构体变量student s1 = { "张三",24,100 };student* p = &s1;printfunction(p);//调用函数cout<<"main函数中:"<< s1.name << " " << s1.age << " " << s1.score << endl;
}

三、结构体中const使用场景

1、作用:用const防止误操作(当代码过大,若进行限制,就会提示你是否进行误操作)

#include<iostream>
using namespace std;
#include<string>
//结构体const使用场景//1、定义结构体(先告诉系统有这样一个数据类型)
struct student
{string name;int age;int score;
};void printsudent(const student *s)//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来
{错误:s->age = 100;//如果这里将形参的属性修改,那么实参也会被修改.加入const后,一旦有修改的操作就会报错,可以防止误操作cout << s->name << " " << s->age << " " << s->score<<endl;
}int main()
{//2、在main函数中创建结构体变量并初始化struct student s = { "张三",15,70 };//通过函数打印结构体变量信息printsudent(&s);cout << "张三的年龄:" << s.age << endl;
}

c++基础知识第十天:结构体嵌套结构体,结构体作函数参数相关推荐

  1. C++之指针探究(十二):指针、下标、数组及其作函数参数

    指针使用下标时,可以理解为数组. 例如:   char ∗\ast∗p = "abcdef";   此时p[2]值为'c':   而p表示字符串"abcdef" ...

  2. 【STM32】基础知识 第十课 CubeMx

    [STM32]基础知识 第十课 CubeMx STM32 CubeMX 简介 安装 JAVA CubeMX 安装 新建 STM32 CubeMX 工程步骤 新建工程 时钟模块配置 GPIO 配置 生成 ...

  3. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  4. Framebuffer基础知识(三十)

    1.Framebuffer应用编程   在Linux系统中通过Framebuffer驱动程序来控制LCD.Frame是帧的意思,buffer是缓冲的意思,这意味着Framebuffer就是一块内存,里 ...

  5. Simulink 环境基础知识(十八)--确定信号维度

    目录 确定信号维度 支持多维信号的 Simulink 模块 确定源模块的输出维度 确定非源模块的输出维度 信号和参数维度规则 输入信号和参数的标量扩展 确定信号维度 Simulink® 模块可以输出一 ...

  6. Mysql数据库基础知识(五)之:视图、变量、存储过程、函数、流程控制结构

    第一部分:Mysql数据库基础知识(一)之 基础查询----分组查询 第二部分:Mysql数据库基础知识(二)之 连接查询----子查询-----分页查询------union联合查询 第三部分:My ...

  7. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)

    转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...

  8. 密码学基础知识(十)查缺补漏(缺)

    今天密码学结束了,哎,都是泪啊,答题时发现脑袋里都是思想,公式没记多少,就主要记了DES AES RC4 RSA的具体算法了,还把LSFR的特征多项式怎么装换成输出f忘了.所以现在补一下那些漏了的知识 ...

  9. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源

    线程生命周期 线程状态 New: 线程创建(new Thread()) Runnable: 线程可运行(thread.start()), 注: 调用start并不一定是运行状态, 可能在等待CPU调度 ...

最新文章

  1. 以下一些使用ASP.NET和VISUAL STUDIO.NET2003的经验和技巧
  2. 机器学习模型部署都有哪些坑?
  3. 使用OpenCV校准鱼眼镜头
  4. sessionId与cookie 的关系(百度文库)
  5. mysql中使用like模糊查询时如何转义%
  6. nginx 怎么重新编译安装mysql,centos 下 编译安装 nginx + mysql + php 服务
  7. 网址的bibtex格式
  8. 知识+AI融合创新探索,华为云论文被AI顶级学术期刊IEEE TPAMI接受
  9. 利用gensim在simulink中建立神经网络模型
  10. HTML5 postMessage解决跨域|跨窗口通信
  11. 21天学通Java 下载参考
  12. Python实现电子词典
  13. 如何在Jetson NANO上安装无线WIFI模块
  14. Kafka集群的搭建与批量启停
  15. The Sybil Attak 女巫攻击 论文翻译
  16. 用Python进行自然语言处理 读书笔记 第一章
  17. 铣床是什么?怎么分类
  18. 一名富有激情的潮汕籍工程师的进阶之路:数据即未来
  19. 在Spydroid-ipcamera基础上做推流的实现之二
  20. 学分绩点计算器java_学分绩点计算器

热门文章

  1. 偏差与方差、经验风险最小化、联合界、一致收敛—机器学习公开课第九讲
  2. Stateflow学习记录(长期更新)
  3. OpenCV 之 RNG rng(12345)
  4. SQLyong连接mysql 2058错误解决方法(记录)
  5. 什么是正向设计和逆向设计?
  6. 怎么报名12月的计算机考试,报名2020年12月计算机考试有哪些流程
  7. Python中网络编程对 socket accept 函数的理解
  8. linux安装FSL
  9. android的try catch,Android捕捉错误try catch 的简单使用教程
  10. 双绞线的分类—按电气特性分