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

news/2024/5/20 0:19:11/文章来源:https://blog.csdn.net/wmh1024/article/details/133474231

一、左值与右值

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

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

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

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

二、指针

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.luyixian.cn/news_show_367970.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云数据库保护需要注意哪些事项?

云数据库保护是在云计算环境中对数据库进行保护和安全管理的重要措施。随着云计算的普及和应用&#xff0c;云数据库的保护也变得尤为重要。以下是安策分享的关于云数据库保护需要注意的一些事项。 云数据库的访问控制是保护数据库的首要任务。只有授权的用户或应用程序才能访问…

3分钟基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来&#xff0c;各大公司在大模型方面持续发力&#xff0c;行业大模型也如雨后春笋一般发展迅速&#xff0c;日常工作中比较多的应用场景还是问答模式&#xff0c;作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT&#xff0c;…

java socket实现代理Android App

实现逻辑就是转发请求和响应。 核心代码 // 启动代理服务器private void startProxyServer() {new Thread(new ProxyServer()).start();}// 代理服务器static class ProxyServer implements Runnable {Overridepublic void run() {try {// 监听指定的端口int port 8098; //一…

如何优雅构建自定义 Spring Boot 验证器,让你的代码更加丝滑!

作为一名开发人员&#xff0c;你应该知道确保应用程序中流动的数据的准确性和完整性是多么重要。Spring Boot提供了强大的验证功能&#xff0c;但有时我们需要额外的验证&#xff0c;创建适合特定需求的自定义验证器。 接下来&#xff0c;我们来介绍下如何完整的创建一个自定义…

Covert Communication 与选择波束(毫米波,大规模MIMO,可重构全息表面)

Covert Communication for Spatially Sparse mmWave Massive MIMO Channels 2023 TOC abstract 隐蔽通信&#xff0c;也称为低检测概率通信&#xff0c;旨在为合法用户提供可靠的通信&#xff0c;并防止任何其他用户检测到合法通信的发生。出于下一代通信系统安全链路的强烈…

揭开黑客的神秘面纱:黑客文化、技术手段与防御策略

目录 1. 引言1.1 黑客的定义与起源1.2 黑客文化的形成与传承 2. 黑客的分类与目标2.1 道德黑客与恶意黑客2.2 黑客攻击的目标与动机解析 3. 黑客的技术手段3.1 网络入侵与渗透测试3.2 社会工程学与钓鱼攻击3.3 恶意软件与病毒传播3.4 数据泄露与身份盗窃 4. 防御黑客攻击的策略…

第2章 Micro SaaS 的优势

本章内容&#xff1a; 1.让您的努力产生更多成果2.可预测的经常性收入带来的财务安全3.最小的启动成本4.与您的用户直接联系5.能够构建一次但将其出售给许多人6.时间自由7.位置自由8.技术自由9.财务自由10.完全自营企业最后的想法 现在我们知道什么是 Micro SaaS&#xff0c;让…

U盘作为启动盘安装苹果OS X操作系统

如何制作 macOS USB启动盘&#xff1f;如何创建可引导的 macOS 安装器&#xff1f;接下来就为大家带来可引导的苹果电脑 macOS 系统U盘启动盘制作教程。U盘是我们在工作和生活中的好帮手&#xff0c;能储存和传递数据文件&#xff0c;重要的是&#xff0c;U盘还可以制作成苹果电…

Cocos Creator3.8 项目实战(七)Listview 控件的实现和使用

滚动列表在游戏中也很常见&#xff0c;比如排行榜 、充值记录等&#xff0c;在这些场景中&#xff0c;都有共同的特点&#xff0c; 那就是&#xff1a;数据量大 &#xff0c; 结构相同。 在cocoscreator 中&#xff0c;没有现成的 Listview 控件&#xff0c; 无奈之下&#xff…

水土保持方案编制丨点型项目、市政工程、线型工程、矿山工程、水利工程、取土场/弃渣场、补报项目、水土保持监测验收等

目录 专题一 点型水土保持方案编制方法及案例分析 专题二 市政工程水土保持方案编制方法及案例分析 专题三 线型工程水土保持方案编制方法及案例分析 专题四 矿山工程水土保持方案编制方法及案例分析 专题五 水利工程水土保持方案编制方法及案例分析 专题六 取土场、弃渣…

BootstrapBlazor企业级组件库:前端开发的革新之路

作为一名Web开发人员&#xff0c;开发前端我们一般都是使用JavaScript&#xff0c;而Blazor就是微软推出的基于.Net平台交互式客户Web UI 框架&#xff0c;可以使用C#替代JavaScript&#xff0c;减少我们的技术栈、降低学习前端的成本。 而采用Blazor开发&#xff0c;少不了需…

VMware Workstation Pro详解

零、文章目录 VMware Workstation Pro详解 1、虚拟机介绍 &#xff08;1&#xff09;介绍 VMware Workstation Pro 是行业标准桌面 Hypervisor&#xff0c;使用它可在 Windows 或 Linux 桌面上运行 Windows、Linux 和 BSD 虚拟机。VMware官网地址&#xff1a;https://www.v…

redis命令学习

redis命令学习 redis的类型分为&#xff1a; string类型hash类型list类型set类型sortedset类型 string类型命令 set key value 设置值&#xff0c;key是键 value是值get key 根据键获取值setex key second value 设置值有效时间 second 是时间setnx key value 只有key不存在…

CUDA 安装

查看自己电脑的cuda版本&#xff1a;见文章 查看CUDA版本 我的是&#xff1a; 他的意思就是说&#xff1a;俺的显卡支持的cuda版本是12.0的&#xff08;向下兼容&#xff09; 然后我的项目tensorflow-gpu版本是1.13.2版本的&#xff0c;对应的cuda为10&#xff1a; &#xff…

picodet onnx转其它芯片支持格式时遇到

文章目录 报错信息解决方法两模型精度对比 报错信息 报错信息为&#xff1a; Upsample(resize) Resize_0 not support attribute coordinate_transformation_mode:half_pixel. 解决方法 整个模型转换过程是&#xff1a;paddle 动态模型转成静态&#xff0c;再用paddle2onnx…

1700*D. Flowers(DP前缀和预处理打表)

Problem - 474D - Codeforces 题意&#xff1a; 有白花和红花两种&#xff0c;把 x 朵花排成一排&#xff0c;要求白花必须连续 k 个一块放置&#xff0c;则有 cnt 种情况。给出 a 和 b&#xff0c;计算a到b之间的 x 对应的 cnt 总和&#xff0c;并且对1e97取模。 解析&#x…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&#xff09;&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务…

日期相关工具类

日期相关工具类 【一】介绍【1】SimpleDateFormat 为什么是线程不安全【2】解决 SimpleDateFormat 线程不安全的方法 【二】LocalDate API【三】LocalTime API【四】LocalDateTime API【五】转换关系【1】LocalDateTime 与 LocalDate 之间的转换【2】LocalDateTime 与 Date 之间…

PHP 个人愿望众筹网站系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 个人愿望众筹网站系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 个人愿望众筹网站 代码 https://download.csdn.net/download/qq_41221322/8…

2023年中国短租公寓主要类型、品牌及行业市场规模分析[图]

短租是一种以24小时为计量单位、按天计费的房屋租赁形式&#xff0c;短租又称日租。短租房有高性价比、特色、浓厚居家感的特点&#xff0c;比起传统酒店的客房更具竞争优势。当前&#xff0c;短租房已经成为人们出行住宿的新选择。短租公寓主要类型有合租公寓、月租公寓、服务…