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

一、左值与右值

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

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

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

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

二、指针

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.mzph.cn/news/97136.shtml

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

相关文章

【Linux常用命令4】系统状态监测命令---2

last&#xff1a;查看所有系统的登录记录 执行last命令时&#xff0c;它会读取/var/log目录下名称为wtmp的文件&#xff0c;并把该文件记录的登录系统或终端的用户名单全部显示出来。默认显示wtmp的记录&#xff0c;btmp能显示的更详细&#xff0c;可以显示远程登录&#xff0…

k8s 集群安装(vagrant + virtualbox + CentOS8)

主机环境&#xff1a;windows 11 k8s版本&#xff1a;v1.25 dashboard版本&#xff1a;v2.7.0 calico版本&#xff1a; v3.26.1 CentOS8版本&#xff1a;4.18.0-348.7.1.el8_5.x86_64 用到的脚本&#xff1a; https://gitcode.net/sundongsdu/k8s_cluster 1. Vagrant创建…

3d 贴图下载quixel

Quixel Megascans https://polyhaven.com/a/studio_small_03 Quixel Bridge&#xff1a;3D艺术家的宝库 在3D建模和渲染的世界中&#xff0c;找到高质量、适合项目的贴图素材至关重要。Quixel Bridge就是这样一个为3D艺术家提供大量免费贴图素材的资源库。在本文中&#xff…

2023去水印小程序源码修复版-前端后端内置接口+第三方接口

去水印小程序源码&#xff0c;前端后端&#xff0c;内置接口第三方接口&#xff0c;修复数据库账号密码错误问题&#xff0c;内置接口支持替换第三方接口&#xff0c;看了一下文件挺全的&#xff0c;可以添加流量主代码&#xff0c;搭建需要准备一台服务器&#xff0c;备案域名…

Spark 弹性分布式数据集 RDD

1.RDD简介 `RDD` 全称为 Resilient Distributed Datasets,是 Spark 最基本的数据抽象,它是只读的、分区记录的集合,支持并行操作,可以由外部数据集或其他 RDD 转换而来,它具有以下特性: 一个 RDD 由一个或者多个分区(Partitions)组成。对于 RDD 来说,每个分区会被一个…

论文阅读--Energy efficiency in heterogeneous wireless access networks

异构无线接入网络的能源效率 论文信息&#xff1a;Navaratnarajah S, Saeed A, Dianati M, et al. Energy efficiency in heterogeneous wireless access networks[J]. IEEE wireless communications, 2013, 20(5): 37-43. I. ABSTRACT && INTRODUCTION 本文提出了无…

【虚拟机栈】

文章目录 1. 虚拟机栈概述2. 局部变量表(Local Variables)3. 操作数栈4. 动态链接4.1 方法的调用&#xff1a;解析与分配 1. 虚拟机栈概述 每个线程在创建时都会创建一个虚拟机栈&#xff0c;其内部保存一个个的栈帧&#xff08;Stack Frame&#xff09;&#xff0c;对应着一次…

互联网Java工程师面试题·Redis 篇·第二弹

目录 16、Redis 集群方案什么情况下会导致整个集群不可用&#xff1f; 17、Redis 支持的 Java 客户端都有哪些&#xff1f;官方推荐用哪个&#xff1f; 18、Jedis 与 Redisson 对比有什么优缺点&#xff1f; 19、Redis 如何设置密码及验证密码&#xff1f; 20、说说 Redis…

【Vue】改变 vuex 中的 state ,子组件 watch 监听不到对象值变化。

文章目录 问题描述解决方法 问题描述 state 状态文件&#xff1a; export default {namespaced: true,state: {params: {aa: ,bb: [],}},mutations: {initParams(state) {state.params {aa: ,bb: [],};},},actions: {}, }父组件 <template> <child childParams&q…

CSS学习笔记

目录 1.CSS简介1.什么是CSS2.为什么使用CSS3.CSS作用 2.基本用法1.CSS语法2.CSS应用方式1. 内部样式2.行内样式3.外部样式1.使用 link标签 链接外部样式文件2.import 指令 导入外部样式文件3.使用举例 3.选择器1.基础选择器1.标签选择器2.类选择器3.ID选择器4.使用举例 2.复杂选…

【微服务】RedisSearch 使用详解

目录 一、RedisJson介绍 1.1 RedisJson是什么 1.2 RedisJson特点 1.3 RedisJson使用场景 1.3.1 数据结构化存储 1.3.2 实时数据分析 1.3.3 事件存储和分析 1.3.4 文档存储和检索 二、当前使用中的问题 2.1 刚性数据库模式限制了敏捷性 2.2 基于磁盘的文档存储导致瓶…

EasyX图形库note4,动画及键盘交互

大家好&#xff0c;这里是Dark Flame Master&#xff0c;专栏从这篇开始就会变得很有意思&#xff0c;我们可以利用今天所学的只是实现很多功能&#xff0c;同样为之后的更加好玩的内容打下基础&#xff0c;从这届开始将会利用所学的知识制作一些小游戏&#xff0c;废话不多说&…

基于支持向量机SVM和MLP多层感知神经网络的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 一、支持向量机&#xff08;SVM&#xff09; 二、多层感知器&#xff08;MLP&#xff09; 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .…

bash命令——linux command

bash命令——linux command 1. Linux下的命令结构2. 重点命令学习2.1 基础命令2.2 文件操作2.3 文件权限2.4 目录操作2.5 环境变量2.6 进程信息2.7 grep命令2.8 awk命令2.9 cut命令2.10 bc命令2.11 sort命令 3. 其他知识点3.1 批量执行某条命令3.2 windows下载数据3.3 创建shel…

几种软件系统集成方式详细介绍

企业在信息化的过程中会根据自身的需求构建各种软件系统&#xff0c;如&#xff1a;网站、OA、CRM、订单系统、采购系统、库存管理、财务系统等&#xff0c;由于所需的软件系统一般是逐步构建和投入使用的&#xff0c;由于构建的时间和所采用的技术等不一样&#xff0c;软件系统…

高精度NTP时钟服务器(时间同步服务器)技术方案探讨

高精度NTP时钟服务器&#xff08;时间同步服务器&#xff09;技术方案探讨 高精度NTP时钟服务器&#xff08;时间同步服务器&#xff09;技术方案探讨 四分天下目前&#xff0c;全球的 GPS卫星同步系统处于“四分天下”状态&#xff0c;以美俄两国的系统处于领导地位&#xff…

Elasticsearch使用mapping映射定义以及基本的数据类型

1、说明 Elasticsearch的映射相当于数据库的数据字典&#xff0c;它定义了每个字段的名称和能够保存的数据类型&#xff0c;并且内置了20多种字段类型用于支持多种多样的结构化数据&#xff0c;这里仅介绍几种常用的字段类型&#xff0c;如需要了解全部的类型&#xff0c;请参…

Go Gin Gorm Casbin权限管理实现 - 3. 实现Gin鉴权中间件

文章目录 0. 背景1. 准备工作2. gin中间件2.1 中间件代码2.2 中间件使用2.3 测试中间件使用结果 3. 添加权限管理API3.1 获取所有用户3.2 获取所有角色组3.3 获取所有角色组的策略3.4 修改角色组策略3.5 删除角色组策略3.6 添加用户到组3.7 从组中删除用户3.8 测试API 4. 最终目…

学习笔记|ADC|NTC原理|测温程序|STC32G单片机视频开发教程(冲哥)|第十九集:ADC应用之NTC

文章目录 1.NTC的原理开发板上的NTC 2.NTC的测温程序编写3.实战小练总结课后练习 1.NTC的原理 NTC&#xff08;Negative Temperature Coefficient&#xff09;是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌…

2.2.3.1vim + ctags + cscope + taglist

在window下,我们一般用Source Insight来查看代码而在linux下,使用vim来查看代码,vim是一个简单的文本浏览/编辑器,它可以通过插件的形式,搭建一个完全的类Source Insight环境,通过快捷键的形式,快速查看、定位变量/函数,本文就是基于vim,通过ctags+cscope+taglist+Ner…