【C++】指针与引用(学习笔记)

news2024/11/19 15:23:33

一、左值与右值

左值:编译器为其单独分配了一块存储空间,可以取其地址的,可以放在赋值运算符左边

右值:数据本身。不能取到其自身地址,只能赋值运算右边

左值最常见的情况如西数和数据成员的名字

右值是没有标识符、不可以取地址的表达式,一般也称之为"临时对象"

二、指针

1、指针的概念

1)内存单元内容与地址

内存由很多内存单元组成。这些内存单元用于存放各种类型的数据

计算机对内存的每个内存单元都进行了编号,这个编号就称为内存地址,地址决定了内存单元在内存中的位置。

C++的编译器让我们通过名字(指针变量)来访问这些内存位置

2)指针的定义

指针本身就是一个变量,其符合变量定义的基本形式,它存储的是值的地址

对类型TT*是“到T的指针”类型。一个类型为T*的变量能保存一个类型T的对象的地址

指针变量是一个专门用来记录变量的地址的变量,通过指针变量可以间接的另一个变量的值

3)间接访问操作

通过一个指针访问它所指向地址的过程称为间接访问或引用指针

这个用于执行间接访问的操作符是单目操作符*

cout << *d << endl;

2、指针数组与数组指针

指针的数组:T* t[]

数组的指针:T(*t)[]

[]优先级比较高

3、const与指针

关于const修饰的部分:

  1. 看左侧最近的部分
  2. 如果左侧没有,则看右侧

4、二级指针

*操作符具有从右向左的结合性

**这个表达式相当于*(*C),从内向外逐层求值

int a = 123;
int* b = &a;
int** C= &b;

cout << a << *b << **c << endl;

5、NULL指针

NULL指针:一个特殊的指针变量,表示不指向任何东西

对于一个指针,如果已经知道将被初始化为什么地址,那么请
赋给它这个地址值,否则请把它设置为NULL

在对一个指针进行间接引用前,请先判断这个指针的值为否为NULL

6、野指针

野指针:未初始化和非法的指针

int *a;
*a = 12;	// 指针未初始化

杜绝“野”指针,指向〝垃圾〞内存的指针。if等判断对它们不起作用,因为
没有置NULL

  1. 指针变量没有初始化
  2. 已经释放不用的指针没有置NULL,如delete和free之后的指针
  3. 指针操作超越了变量的作用范围

三、c++内存布局

1、存储区域划分

2、堆heap

利用堆(heap)空间动态分配资源

动态内存具有不确定性,C++让程序员完全接管内存的分配释放

3、动态分配与回收

程序通常需要牵涉到三个内存管理器的操作:

  1. 分配一个某个大小的内存块
  2. 释放一个之前分配的内存块
  3. 垃圾收集操作,寻找不再使用的内存块并予以释放(这个回收策略需要实现性能、实时性、额外开销等各方面的平衡,很难有统一和高效的做法)

C++做了1、2;Java做了1、3

4、RAII

RAII (Resource Acquisition Is Initialization)

C++所特有的资源管理方式。有少量其他语言,如D、Ada 和Rust也采纳了 RAll,但主流的编程语言中,C++是唯一一个依赖 RAII来做资源管理的

RAIl 依托栈和析构函数,来对所有的资源,包括堆内存在内进行管理。对 RAII 的使用,使得 C++不需要类似于 Java 那样的垃圾收集方法,也能有效地对内存进行管理。RAIl 的存在,也是垃圾收集虽然理论上可以在 C++使用,但从来没有真正流行过的主要原因

RAII有些比较成熟的智能指针代表

5、不同变量的对比

1)栈和堆中的变量

栈(stack)区堆(heap)区
作用域函数体内,语句块{}作用域整个程序范围内,new,malloc开始,delete,free结束
编译期间大小确定变量大小范围确定变量大小范围不确定,需要
运行期确定
大小范围Windows系统默认栈大小是1M,linux常见默认的栈大小是8M或10M (ulimit-s)所有系统的堆空间上限是接近内存(虚拟内存)的总大小的(一部分被OS占用)
内存分配方式地址由高到低减少地址由低到高增加
内容是否可变可变可变

2)全局静态存储区和常量存储区的变量

全局静态存储区常量存储区
存储内容全局变量,静态变量常量
编译期间大小是否确定确定确定
内容是否可变可变不可变

5、内存泄露

内存泄漏:程序中己动态分配的堆内存由于某种原因程序末释放或无法释放。造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果

五、智能指针

1、auto_ptr

auto_ptr在c++17中移除

特点:由new expression 获得对象,在auto_ptr对象销毁时,他所管理的对象也会自动被 delete掉

所有权转移:不小心把它传递给另外的auto_ptr,原来的指针就不再拥有这个对象了。在拷贝或赋值过程中,会直接剥夺指针对原对象对内存的控制权,转交给新对象,然后再将原对象指针置为nullptr

2、unique_ptr

特点:专属所有权,所以unique_ptr管理的内存,只能被一个对象持有,不支持复制和赋值

移动语义:unique_ ptr禁止了拷贝语义,但提供了移动语义,即可以使用std::move()进行控制所有权的转移

3、shared_ptr

shared_ptr通过一个引用计数共享一个对象。当引用计数为0时,该对象没有被使用,可以进行析构

shared_ptr是为了解决auto_ptr在对象所有权上的局限性,在使用引用计数的机制上提供了可以共享所有权的智能指针(但需要额外的开销)

循环引用:引用计数会带来循环引用的问题

循环引用会导致堆里的内存无法正常回收,造成内存泄漏

4、weak_ptr

weak_ptr 被设计为与shared_ptr共同工作,以一种观察者模式工作

作用是协助 shared_ptr 工作,可获得资源的观测权,像旁观者那样观测资源的使用情况

观察者意味着weak_ptr只对shared_ptr进行引用,而不改变其引用计数。当被观察的shared_ptr失效后,相应的weak_ptr也相应失效

六、引用

1、引用概述

引用:一种特殊的指针,不允许修改的指针

引用的基本使用:可以认为是指定变量的别名,使用时可以认为时变量本身

int x1 = 1,x2 = 3:
int& rx = x1;
rx = 2;
cout << x1 << endl;		//2
cout << rx << endl;		//2
rx = x2;
cout << ×1 << endl;		//3
cout << ry << endl;		//3

2、引用存在的意义

有了指针为什么还需要引用?为了支持函数运算符重载

有了引用为什么还需要指针?为了兼容C语言

3、补充

对内置基础类型(如int,double等)而言,在两数中传递时pass by value 更高效

对面向对象中自定义类型而言,在函数中传递时pass by reference to const更高效

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

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

相关文章

如何轻松使用 ChatGPT 进行论文大纲和创作

ChatGPT能够编写复杂的代码、博客文章等&#xff0c;它可以帮助我们做很多事情。今天本篇文章分享的主要内容如何利用 ChatGPT 来撰写论文文章。下面会介绍如何轻松使用 ChatGPT 进行论文大纲和创作&#xff01; 1、使用 ChatGPT 确定主题 文章非常重要的一个部分就是主题。如…

Bark Ai 文本转语音 模型缓存位置修改

默认缓存位置在&#xff1a;~/.cache 加入环境变量&#xff1a;XDG_CACHE_HOME&#xff0c;指定缓存位置 修改后新的位置为&#xff1a; D:\Ai\Bark\Bark Cache

如何使用 API 接口获取商品数据,从申请 API 接口、使用 API 接口到实际应用

在当今的数字化时代&#xff0c;应用程序接口&#xff08;API&#xff09;已经成为数据获取的重要通道。API 接口使得不同的应用程序能够方便地进行数据交换&#xff0c;从而促进了信息的广泛传播和利用。在众多的数据源中&#xff0c;商品数据是一个非常重要的领域&#xff0c…

大数据软件项目的验收流程

大数据软件项目的验收流程是确保项目交付符合预期需求和质量标准的关键步骤。以下是一般的大数据软件项目验收流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.项目验收计划制定&#xff1a; 在…

水库安全监测方案(实时数据采集、高速数据传输)

​ 一、引言 水库的安全监测对于防止水灾和保障人民生命财产安全至关重要。为了提高水库安全监测的效率和准确性&#xff0c;本文将介绍一种使用星创易联DTU200和SG800 5g工业路由器部署的水库安全监测方案。 二、方案概述 本方案主要通过使用星创易联DTU200和SG800 5g工业路…

mac m1打开word或excel显示VB运行时错误53,怎么解决这个问题,亲测有效!

mac m1打开word或excel或ppt时显示VB运行时错误53,每次都要点击多次,才能结束,用起来非常不方便,很麻烦,那么怎么解决这个问题呢,为大家献上,亲测有效! 如上图 非常简单 选择工具 找到模板加载项 如下图 点进去哈 接下来进入到以下画面

5.绘制多点

愿你出走半生,归来仍是少年&#xff01; 前面几个案例通过TS传入点参数实现绘制&#xff0c;但是每次的绘制都是单独绘制一个点&#xff0c;未实现一次绘制多个点的效果。该案例通过GL的Buffer实现一次绘制多点。 1.知识点 1.1.缓冲区绘制流程 通过缓冲区对象处理数据时&…

三相交流电压控制器供电的三相异步电动机定子电压控制研究(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

统计教程|PASS实现单因素二元Logistic回归分析且自变量为二分类的优势比检验的样本量估计

在对临床数据的探索分析工作中&#xff0c;我们经常会使用Logistic回归分析去探索影响疾病的发生、发展的重要影响因素&#xff0c;或应用Logistic回归模型进行相关的预测分析。但是在进行Logistic回归分析时&#xff0c;样本含量的估计常常是令临床科研工作者最头痛的一件事了…

百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览

1. 预测部署简介与总览 本章主要介绍PP-OCRv2系统的高性能推理方法、服务化部署方法以及端侧部署方法。通过本章的学习&#xff0c;您可以学习到&#xff1a; 根据不同的场景挑选合适的预测部署方法PP-OCRv2系列模型在不同场景下的推理方法Paddle Inference、Paddle Serving、…

服务器数据恢复-V7000存储2块磁盘故障脱机的数据恢复案例

服务器数据恢复环境&#xff1a; P740AIXSybaseV7000存储&#xff0c;存储阵列柜上共12块SAS机械硬盘&#xff08;其中一块为热备盘&#xff09;。 服务器故障&#xff1a; 存储阵列柜中有磁盘出现故障&#xff0c;工作人员发现后更换磁盘&#xff0c;新更换的磁盘数据同步到40…

聚观早报 | 问界新 M7 车型破单日大定纪录;iQOO 12影像大升级

【聚观365】10月7日消息 问界新 M7 车型破单日大定纪录 iQOO 12影像大升级 三星Galaxy S23 FE发布 欧拉好猫在墨西哥上市 1-8月我国智能手机产量6.79亿台 问界新 M7 车型破单日大定纪录 据问界官方消息&#xff0c;AITO 问界汽车的新 M7 车型在中秋国庆长假期间又刷新了自…

读书笔记——《三国演义》

前言 提起《三国演义》似乎每个人都可以说几个其中的人物、情节&#xff0c;但是你真的看过《三国演义》原著吗&#xff1f; 本身很喜欢三国题材游戏&#xff0c;一些游戏比如《霸王大陆》《全战三国》等等都是我的最爱&#xff0c;很喜欢收集名将大杀四方的感觉。但是回想起…

使用 Bun 快速搭建一个 http 服务

前端运行时 Bun 1.0 正式发布&#xff0c;如今&#xff0c;Bun 已经稳定并且适用于生产环境。Bun 不仅是一个专注性能与开发者体验的全新 JavaScript 运行时&#xff0c;还是一个快速的、全能的工具包&#xff0c;可用于运行、构建、测试和调试 JavaScript 和 TypeScript 代码&…

6-4 删除链表中的元素 分数 10

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* prv NULL;struct ListNode* cur head;// 处理头节点等于val的情况while (cur ! NULL && cur->val val) {head cur->next;free(cur);cur head;}// 处理中间节点和尾节点…

linux本机进程间通信之UDS

本机进程间通信有很多方式&#xff0c;百度有太多的文章来介绍相关&#xff0c;大致有消息队列、共享内存、socket等、这里重点介绍下socket&#xff08;套接字&#xff09;的一种用法&#xff0c;一般情况下在socket是用于不同主机间的通信&#xff0c;但是当通信双方在同一台…

大模型遇上数智化,腾讯云与行业专家共探行业AI发展之路

引言 自去年底 OpenAI 推出 ChatGPT 起&#xff0c;大模型作为新的生产工具登上了新一轮生产力革命的舞台。事实上&#xff0c;数十年来历经了多次起落的 AI 技术&#xff0c;尽管一直被赋予着极高的期待&#xff0c;但在落地产业端时&#xff0c;却总显得差强人意。大模型的爆…

试题:动态规划

爱吃鬼 小艺酱每天都在吃和睡中浑浑噩噩的度过。 可是小肚子是有空间上限v的。 小艺酱有n包零食&#xff0c;每包零食占据小肚子空间a_i并会给小艺酱一个甜蜜值b_i。 小艺酱想知道自己在小肚子空间上限允许范围内最大能获得的甜蜜值是多少? 使用c和动态规划解题&#xff1a…

伦敦银最新价格能进吗?

不少新手的伦敦银投资者由于看不懂行情走势&#xff0c;在行情机会来临时总感觉患得患失&#xff0c;但由于又十分渴望在这个市场上实现收益&#xff0c;所以经常通过各种各样的方式方法和手段&#xff0c;希望行情走势什么时候会出现进场的机会。 可以肯定的是&#xff0c;伦敦…

大语言模型黑盒被打破;Meta 元宇宙硬件亏损可能高于市场共识丨 RTE 开发者日报 Vol.60

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有…