结构体与引用

news2025/2/25 5:52:48

1.结构体基本概念

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

2.结构体定义和使用

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

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

struct 结构体名 变量名

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

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

struct Student {

//姓名

string name;

int age;

string address;

}stul;

stul.name = "11111";

cout << stul.name<< endl;

struct Student stu2;

stu2.name = "222222";

cout << stu2.name << endl;

3.结构体数组

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

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

//创建结构体数组

struct Student stuArray[3] =

{

{"login",45,"ggg"},

{"res",35,"yyy"},

{"ooo",45,"ppp"},

};

//遍历结构体数组

for (int i = 0;i < 3;i++)

{

cout << "姓名:" << stuArray[i].name << " 年龄:" << stuArray[i].age << endl;

}

4.结构体指针

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

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

//1.创建学生结构体变量

struct Student s = {"df",3," fd"};

//2.通过指针指向结构体变量

Student *p = &s;

//3.通过指针访问结构体变量中的数据

cout << "姓名: " << p->name << endl;

5.结构体中const使用场景

作用: 用const来防止误操作

//将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来

void printStudents(const Student *s) {

//s->name = "gg";//加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作

cout << "姓名: " << s->name << endl;

}

6.内存分区模型

C++程序在执行时,将内存大方向划分为4个区域

·代码区: 存放函数体的二进制代码,由操作系统进行管理的

·全局区: 存放全局变量和静态变量以及常量

·栈区:由编译器自动分配释放,存放函数的参数值,局部变量等

·堆区: 由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义:

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区:

存放CPU执行的机器指令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

全局变量和静态变量存放在此.

全局区还包含了常量区,字符串常量和其他常量也存放在此.

该区域的数据在程序结束后由操作系统释放

栈区:

由编译器自动分配释放,存放函爱的参数值,局部变量等

注意事项: 不要返回局部变量的地址,栈区开辟的数据由编译器自动释放.'局部变量存放在栈区,栈区的数据在函数执行完后自动释放.

堆区:

融程序员分配释放,若程序员不释放,程序结束时由操作系统回收

在C++中主要利用new在堆区开辟内存

7.New操作符

C++中利用new操作符在堆区开辟数据

堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete

语法: new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

//创建10整型数据的数组,在堆区

int *arr = new int[10];

for (int i = 0;i < 10;i++) {

arr[i] = i + 22;//赋值

cout << arr[i] << endl;

}

//释放堆区的数组

//释放数组的时候要加[]才可以

delete[] arr;

8.引用

对变量起别名

本质: 引用的本质在c++内部实现是一个指针常量.

引用基本语法 : 数据类型 &别名 = 原名

int a = 10;

int &b = a;

引用注意事项

·引用必须初始化

·引用在初始化后,不可以改变

int &b;//错误

int c=5;

int a=6;

int &b=a;

b=c; //赋值操作,而不是更改引用

引用做函数参数

作用: 函数传参时,可以利用引用的技术让形参修饰实参

优点: 可以简化指针修改实参

//引用传递

void Swap03(int &a, int &b) {

int temp = a;

a = b;

b = temp;

}

//指针传递

void swap(int *a, int*b) {

int temp = *a;

*a = *b;

*b = temp;

}

引用做函数返回值

作用: 引用是可以作为函数的返回值存在的

注意: 不要返回局部变量引用

int& tt1() {

int a = 7;//局部变量 存放在四区中的 栈区

return a;

}

int &he = tt1();

cout << "he= " << he << endl;//第一次结果正确,是因为编译器做了保留

cout << "he= " << he << endl;//第二次结果错误,因为a的内存已经释放

用法: 函数调用作为左值

int& tt2() {

static int a = 7; // 静态变量,存放在全局区,全局区上的数据在程序结束后系统释放

return a;

}

int &he2 = tt2();

cout << "he2= " << he2 << endl;

cout << "he2= " << he2 << endl;

tt2() = 999;;//如果函数的返回值是引用,这个函数调用可以作为左值

cout << "he2= " << he2 << endl;

cout << "he2= " << he2 << endl;

常量引用

作用: 常量引用主要用来修饰形参,防止误操作

在函数形参列表中,可以加const修饰形参,防止形参改变实参

//打印

void showValue(const int &val) {

//val = 999;//错误

cout << "val=" << val << endl;

}

//加上const之后编译器将代码修改 int temp = 10; const int & ref = temp;

const int & ref=10;//引用必须引一块合法的内存空间

// ref = 11; // 加入const之后变为只读,不可以修改 |

int a = 12;

showValue(a);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《爆肝整理》保姆级系列教程python接口自动化(十八)--重定向(Location)(详解)

简介   在实际工作中&#xff0c;有些接口请求完以后会重定向到别的url&#xff0c;而你却需要重定向前的url。URL主要是针对虚拟空间而言&#xff0c;因为不是自己独立管理的服务器&#xff0c;所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&…

分布式session共享解决方案

分布式session共享解决方案 1.分布式 Session 问题 示意图 解读上图&#xff0c;假如我们去购买商品 当 Nginx 对请求进行负载均衡后, 可能对应到不同的 Tomcat比如第 1 次请求, 均衡到 TomcatA, 这时 Session 就记录在 TomcatA, 第 2 次请求&#xff0c; 均衡到 TomcatB, 这…

【Mysql8.0取消严格区分大小】已安装的mysql8.0取消严格区分大小写及mysql8.0重装与赋权限详解(2023年亲测有效)

【写在前面】其实故事要从my.cnf为空&#xff0c;且lower-case-table-names为0开始&#xff0c;linux环境下mysql8.0及其之后的版本对表名和数据库是严格区分大小写的&#xff0c;从而导致我们运行项目时候会报错Table xxx.QRTZ_LOCKS doesnt exist。但是我已经装好了mysql8.0咋…

17.CSS伪类

举一个简单的例子来说明什么是伪类&#xff1f; 从之前的代码中&#xff0c;如下图&#xff0c;我们像给这两个列表中的某一列单独设置样式&#xff0c;我们该如何做呢&#xff1f; 我们肯定会选择在li标签上添加class去实现&#xff0c;如下 开始标记结束标记实际元素 <…

python--matplotlib(2)

前言 Matplotlib画图工具的官网地址是 http://matplotlib.org/ Python环境下实现Matlab制图功能的第三方库&#xff0c;需要numpy库的支持&#xff0c;支持用户方便设计出二维、三维数据的图形显示&#xff0c;制作的图形达到出版级的标准。 实验环境 Pycharm2020.2.5社区版,w…

算法练习-链表(二)

算法练习-链表&#xff08;二&#xff09; 文章目录算法练习-链表&#xff08;二&#xff09;1. 奇偶链表1.1 题目1.2 题解2. K 个一组翻转链表2.1 题目2.2 题解3. 剑指 Offer 22. 链表中倒数第k个节点3.1 题目3.2 题解3.2.1 解法13.2.2 解法24. 删除链表的倒数第 N 个结点4.1 …

中国智能物流行业市场规模及未来发展趋势

中国智能物流行业市场规模及未来发展趋势编辑中国智能物流行业市场规模正在快速增长。随着电子商务、物流配送、物联网等行业的发展&#xff0c;物流行业需求不断提高&#xff0c;智能物流产品应运而生。智能物流行业主要通过智能化管理、智能路径规划、智能定位、物流配送等方…

Java特性之设计模式【工厂模式】

一、工厂模式 概述 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式 在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通…

投票需要什么流程微信投票互助平台的免费投票平台搭建

“最美家政人”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利&#xff0c;而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票&#xff0c;对于运营及推广来说找一个合适的投票小程序能够提高工作效…

Java-集合(5)

Map接口 JDK8 Map接口实现子类的特点 Map和Collection是并列关系&#xff0c;Map用于保存具有映射关系的数据&#xff1a;Key-ValueMap中的key和value可以是任何引用类型的数据&#xff0c;会封装到HashMap$Node对象中Map中的key不允许重复&#xff0c;原因和HashSet一样Map…

2023年美赛MCM 问题C:预测Wordle结果 ​

目录2023年美赛MCM 问题C: 预测Wordle结果 ​1. 背景2. 要求3. 附件1. 数据文件。2. 纽约时报网站上发布的 Wordle 指南4. 参考2023年美赛MCM 问题C: 预测Wordle结果 ​ 1. 背景 Wordle 是纽约时报目前每天提供的流行拼图。 玩家尝试通过在六次或更少的尝试中猜测一个五个字母…

记录一次Binder内存相关的问题导致APP被杀的BUG排查过程

事情的起因的QA压测过程发生进程号变更&#xff0c;怀疑APP被杀掉过&#xff0c;于是开始看日志 APP的压测平台会上报进程号变更时间点&#xff0c;发现是在临晨12&#xff1a;20分&#xff0c;先大概确定在哪个日志文件去找关键信息一开始怀疑是crash&#xff0c;然后就在日志…

shiro CVE-2020-1957

0x00 前言 在之前只是单纯的复现了漏洞&#xff0c;没有记笔记&#xff0c;所以补充了这篇分析笔记。 影响版本&#xff1a;shiro < 1.5.2 0x01 环境搭建 环境用的是&#xff1a;https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic 0x02 漏…

用python实现对AES加密的视频数据流解密

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 在做网络爬虫的时候,会遇到经过AES加密的数据,可以使用python来进行解密。 在做爬虫的时候,通常可以找到一个key,这个key是一个十六进制的一串字符,这传字符是解密的关键。所以对于…

SpringBoot2.X整合ClickHouse项目实战-从零搭建整合(三)

一、ClickHouseSpringBoot2.XMybatisPlus整合搭建 二、需求描述和数据库准备 三、ClickHouse统计SQL编写实战和函数使用 四、ClickHouseSpringBoot2.X案例-基础模块搭建 controller/request层 mapper层 model层 service层 五、ClickHouseSpringBoot2.X案例-数据统计接口 …

城市轨道交通供电系统研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

一文告诉你什么是财务数据治理?

大家好&#xff0c;我是梦想家Alex&#xff0c;今天是周末&#xff0c;就不给大家分享技术文了&#xff5e;应出版社老师推荐&#xff0c;文末给大家送几本DAMA中国主席力荐&#xff0c;20位行业专家历时2年共同打造的《财务数据治理实战》&#xff0c;将数据治理理论应用于财务…

怎样查询PMP成绩?

【如何查询成绩】1、输入网址&#xff08;PMI官网&#xff0c;不知道网址的私戳&#xff09;&#xff0c;点击 Log In如果忘记 PMI 的账号和密码了&#xff0c;怎么办&#xff1f;可以在你报名机构官网的个人中心的学习中心的我的报名处查看 PMI 的注册名和密码2、点击 Exam An…

CMake 入门学习4 软件包管理

CMake 入门学习4 软件包管理一、Linux下的软件包管理1. 检索已安装的软件包2. 让自己编译软件支持pkg-config搜索3. 在CMakeLists查找已安装的软件包二、适合Windows下的包管理工具1. vcpkg2. Conan(1) 安装Conan(2) 配置Conan(3) 创建工程(4) 安装依赖库(5) 使用依赖库三、CMa…

汉字----dgfont

Abstract 字符生成是一个具有挑战性的问题,特别是对于一些由大量字符组成的书写系统,近年来受到了广泛的关注。然而,现有的字体生成方法通常是在监督学习中。它们需要大量的配对数据,这是劳动密集型和昂贵的收集。此外,常见的图像到图像转换模型通常将风格定义为纹理和颜…