指针和引用

指针使用操作符 "*" 和 "->",引用使用操作符".",他们具有相同的功能,都是间接的引用其他对象。

指针和引用的选择

在任何情况下都不能使用指向空值的引用,引用总是必须指向某些对象。如果你使用一些变量并且让它指向一个对象,但是该变量在某些时候也可以不指向任何对象,那么此时应该把变量声明为指针,因为这样可以赋空值给该变量。相反,如果该变量肯定指向一个对象,并且不允许该变量为空,那么就可以将变量声明为引用。

空指针是表示指向不存在的对象或者空对象的指针

如果不按照以上设计,将会出现什么问题?

char *p = 0; // 将指针设置为空值
char& pc = *p; // 将引用指向空值

将引用指向空值,这样结果将是不确定的,编译器会产生一些输出,导致任何事情的发生。
因为引用肯定会指向一个对象,在c++中,引用应该被初始化。

引用是一种特殊的指针,它们允许我们使用变量的别名来访问该变量的值。如果没有初始化引用,那么它们将指向未知的内存位置,这可能会导致程序错误或安全漏洞。

引用本质上是一个别名,必须指向一个已经存在的对象,如果没有初始化,编译器无法确定引用指向哪个对象,会报错。

string& rs; // 错误,引用必须初始化
string s("hhh");
string& rs = s; //正确,rs指向sstring *ps; // 正确,未初始化的指针,合法但是危险

不存在指向空值的引用这个事实意味着:使用引用的代码效率比指针的高,因为在使用引用之前不需要判断它的合法性。

void printDouble(const double& rd) 
{ cout << rd; // 不需要测试 rd,它肯定指向一个 double 值
}相反,指针则应该总是被测试,防止其为空: void printDouble(const double *pd) 
{ if (pd) { // 检查是否为 NULL cout << *pd; } 
} 

指针和引用的另一个区别是:指针可以被重新赋值给另一个不同的对象,但是引用总是指向在初始化时被指定的对象,以后不能改变。

string s1("Nancy"); 
string s2("Clancy"); 
string& rs = s1; // rs 引用 s1 
string *ps = &s1; // ps 指向 s1 
rs = s2; // rs 仍旧引用 s1, 但是 s1 的值现在是"Clancy" 
ps = &s2; // ps 现在指向 s2; s1 没有改变 

总结:

在以下情况应该使用指针:
    1. 存在不指向任何对象的可能(这种情况下,可以设置指针为空);
    2. 需要能够在不同的时刻指向不同的对象(这种情况下,可以改变指针的指向);
使用引用:
    1. 总是指向一个对象,并且一旦指向一个对象后就不会改变指向;
    2. 另外,还有一种情况,就是当重载某个操作符的时候,使用引用;

如:操作符[],这个操作符典型的用法是返回一个目标对象,其能被赋值。

vector<int> v(10); // 建立整形向量(vector),大小为 10; // 向量是一个在标准 C 库中的一个模板
v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值 如果操作符[]返回一个指针,那么后一个语句就得这样写: 
*v[5] = 10; 但是这样会使得 v 看上去象是一个向量指针。因此你会选择让操作符返回一个引用。

当你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针。 

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

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

相关文章

鸡兔同笼问题加强版

描述 已知鸡和兔的总数量为 n,总腿数为 m。输入 n 和 m,依次输出鸡和兔的数目&#xff0c;如果无解&#xff0c;则输出 “No answer”(不要引号)。 输入描述 第一行输入一个数据 a,代表接下来共有几组数据&#xff0c;在接下来的 (a≤100000) a 行里&#xff0c;每行都有一个…

GhostscriptExample GS

1.导出图片 package cn.net.haotuo.pojo; import java.io.*;public class GhostscriptExample {public static void main(String[] args) { String gsPath "C:/Program Files/gs/gs9.54.0/bin/gswin64c.exe";String inputFilePath "C:\\Users\\Admini…

idea将本地编译好的代码上传到hub镜像仓库

第一步&#xff1a;编译打包本地的文件 package 第二步&#xff1a;执行docker bulid打包命令 docker build -t sunyuhua/algo-ability:1.0.0 .sunyuhuasunyuhua-HKF-WXX:~/workspace/shbgit/algo-ability$ docker build -t sunyuhua/algo-ability:1.0.0 . [] Building 141.…

C语言编译器(C语言编程软件)完全攻略

介绍常用C语言编译器的安装、配置和使用。 常用的C语言编译器&#xff08;编程软件&#xff09;介绍&#xff0c;同时附带下载地址、详细的安装教程和使用教程。我们还对比了不同C语言编译器&#xff08;C语言编程软件&#xff09;的优缺点&#xff0c;让初学者知道该如何选择…

差分电路原理以及为什么输出电压要偏移

我们在使用放大器芯片的时候&#xff0c;除了对放大器芯片本身应用外&#xff0c;通常还需要搭建一些外围电路来满足放大器芯片的使用条件&#xff0c;最终满足应用的功能&#xff0c;下面通过一个差分电路来熟悉这些应用。 差分运算放大电路&#xff0c;对共模信号得到有效抑…

微软的一些公开课,Python、机器学习、SQL、AI,全部免费

大家好&#xff0c;我是老章&#xff0c;刷X看到一位博主Alif Hossain⚡alifcoder总结了微软的一些公开课&#xff0c;全部免费&#xff0c;蛮不错的。感兴趣可以学一波&#xff0c;还能领徽章。 1. 机器学习简介 本课程是学习机器学习基础知识和用例的好方法。 → 11 个模块…

C# Image Caption

目录 介绍 效果 模型 decoder_fc_nsc.onnx encoder.onnx 项目 代码 下载 C# Image Caption 介绍 地址&#xff1a;https://github.com/ruotianluo/ImageCaptioning.pytorch I decide to sync up this repo and self-critical.pytorch. (The old master is in old ma…

实战演练 | Navicat 中编辑器设置的配置

Navicat 是一款功能强大的数据库管理工具&#xff0c;为开发人员和数据库管理员提供稳健的环境。其中&#xff0c;一个重要功能是 SQL 编辑器&#xff0c;用户可以在 SQL 编辑器中编写和执行 SQL 查询。Navicat 的编辑器设置可让用户自定义编辑器环境&#xff0c;以满足特定的团…

ejs默认配置 造成原型链污染

文章目录 ejs默认配置 造成原型链污染漏洞背景漏洞分析漏洞利用 例题 [SEETF 2023]Express JavaScript Security ejs默认配置 造成原型链污染 参考文章 漏洞背景 EJS维护者对原型链污染的问题有着很好的理解&#xff0c;并使用非常安全的函数清理他们创建的每个对象 利用Re…

鸿蒙应用中的通知

目录 1、通知流程 2、发布通知 2.1、发布基础类型通知 2.1.1、接口说明 2.1.2、普通文本类型通知 2.1.3、长文本类型通知 2.1.4、多行文本类型通知 2.1.5、图片类型通知 2.2、发布进度条类型通知 2.2.1、接口说明 2.2.2、示例 2.3、为通知添加行为意图 2.3.1、接…

Python基础知识总结1-Python基础概念搞定这一篇就够了

时隔多年不用忘却了很多&#xff0c;再次进行python的汇总总结。好记性不如烂笔头&#xff01; PYTHON基础 Python简介python是什么&#xff1f;Python特点Python应用场景Python版本和兼容问题解决方案python程序基本格式 Python程序的构成代码的组织和缩进使用\行连接符 对象…

从零学Java 内部类

Java 内部类 文章目录 Java 内部类1 什么是内部类?2 内部类的分类2.1 成员内部类2.2 静态内部类2.3 局部内部类2.4 匿名内部类 1 什么是内部类? 概念: 在一个类的内部再定义一个完整的类, 内层的类称为内部类 特点: 编译之后可生成独立的字节码文件 内部类可以访问外部类的…

解决ChatGPT4.0无法上传文件

问题描述 ChatGPT4.0&#xff1a;上传文件时出错 解决方案&#xff1a; 仔细检查文件的编码格式&#xff0c;他似乎目前只能接受utf-8的编码&#xff0c;所以把文件的编码改为UTF-8即可成功上传

【十六】【动态规划】97. 交错字符串、712. 两个字符串的最小ASCII删除和、718. 最长重复子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

Hadolint:Lint Dockerfile 的完整指南

想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗&#xff1f;这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。 通过对 Dockerfile 进行 lint 检查&#xff0c;您可以及早发现错误和问题&#xff0c;并确保它们遵循最佳实践。 什么是Hadolint…

坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)

1 需求 坐标系概念&#xff1a; 经纬度坐标&#xff08;EPSG:4326&#xff09;&#xff1a;WGS84坐标系&#xff08;World Geodetic System 1984&#xff09;是一种用于地球表面点的经纬度坐标系。它是美国国防部于1984年建立的&#xff0c;用于将全球地图上的点定位&#xff0…

Vue-2、初识Vue

1、helloword小案列 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>初始Vue</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.n…

【贪心算法】Dijkstra 算法及其衍生

目录 Dijkstra 算法Dijkstra 算法正确性证明 Dijkstra 算法的复杂度优化 Dijkstra 算法的衍生SSSP的应用 Dijkstra 算法 1959 年&#xff0c;Edsger Dijkstra 提出一个非常简单的贪心算法来求解单源最短路径问题&#xff08;Single-Source Shortest Path&#xff0c;SSSP&…

Prometheus相关问题及答案(2024)

1、Prometheus是什么以及它的主要用途 Prometheus是一个开源的监控和警告工具包&#xff0c;它最初由SoundCloud构建&#xff0c;并成为云原生计算基金会(CNCF)下的一部分&#xff0c;与Kubernetes和其他工具一起构成云原生技术栈。 主要特点&#xff1a; 多维数据模型&…

go 语言中的类型判断

_. ok : interface{}(a).(B)此语句用于判断对象a是否是B类型 也可以判断对象a是否实现了B接口 package mainimport "fmt"type Pet interface {SetName(name string)Name() stringCategory() string } type Dog struct {name string }func (dog *Dog) SetName(name …