Basics——指针和引用(详解)

news2024/12/27 11:00:47

指针和引用

  • 1.初始化规则
  • 2.面试题 :引用和指针的区别是什么
  • 3.引用使用场景
  • 4.拓展 为什么C+支持引用而C没有

1.初始化规则

  • 指针和引用在初始化方面有不同的规则:
  1. 指针的初始化规则:

直接初始化:可以将指针初始化为指向特定变量或内存地址。例如:int* ptr = &myVariable;空指针初始化:可以将指针初始化为空指针,表示它不指向任何有效的内存地址。例如:int* ptr = nullptr; 或 int* ptr = NULL;野指针初始化:应避免将指针初始化为未初始化的值,因为它可能指向未知的内存地址。

  1. 引用的初始化规则:

引用必须在定义时进行初始化,并且不能在后续的代码中重新绑定到另一个对象。例如:int x = 5; int& ref = x;引用必须绑定到一个已经存在的对象,而不能绑定到字面量或表达式。例如:int& ref = x; 是有效的,而 int& ref = 5; 是不允许的。
引用在初始化后成为所绑定对象的别名,对引用的操作实际上是对所绑定对象的操作。
3. 需要注意的是,指针和引用在其用法和语义上有一些差异。指针可以重新赋值指向不同的对象,而引用在初始化后不能重新绑定到其他对象。此外,指针可以为空,而引用必须绑定到一个已存在的对象。在选择使用指针还是引用时,需要考虑到具体的需求和语义要求。

看下面这代码:

using namespace std;
#include<iostream>

//指针和引用
void test1()
{
	char* pc = 0;
	char& rc = *pc;
	cout << rc << endl;
}
int main()
{
	test1();
	return 0;
}

上面这段代码 初始化的时候让指针赋值为空 而rc为空指针的引用 下面是vs和linux下的运行结果
1
在编译时都能通过 运行的时候就出现了异常!!

2.面试题 :引用和指针的区别是什么

引用和指针的区别如下:

  1. 指针是个地址需要存放在内存而引用并不占据额外的存储空间,它只是给已经存在的对象起了一个别名。并不独立占据空间

  2. 初始化:引用必须在定义时进行初始化,并且一旦初始化后,它将一直引用同一个对象,无法改变引用的目标。指针可以在定义后不进行初始化,也可以在任何时候指向不同的对象。

  3. 空值:引用不能为null或空值,必须始终引用一个有效的对象。指针可以为null或空指针,表示不引用任何对象。

  4. 语法:引用使用&符号声明,指针使用符号声明。在使用引用时,无需使用解引用操作符来访问对象的值。

3.引用使用场景

  1. 参数传递:通过引用可以在函数间传递参数,并实现对参数的修改,而无需进行拷贝操作。
  2. 返回值:函数可以返回引用类型,使得函数的返回值可以被赋值给其他变量,并直接修改原始对象。
  3. 遍历和修改容器:在遍历容器或修改容器元素时,使用引用可以提高效率并简化代码。
  4. 防止拷贝:通过使用常量引用作为函数参数或类成员,可以避免不必要的拷贝操作,提高性能。

4.拓展 为什么C+支持引用而C没有

  • C语言是在20世纪70年代早期开发的,它的设计目标是作为低级别的系统编程语言。C语言的设计哲学是简洁、高效和可移植,注重对硬件的直接控制和低级别的操作。在当时的计算机硬件和编程环境下,指针是一种更为灵活和强大的机制,可以满足对内存和底层资源的直接访问需求。因此,C语言选择了指针作为主要的间接访问机制,而没有引入引用。

  • 后来,C++语言作为C的扩展,引入了许多新特性,其中包括引用。C++语言的设计目标是在保留C的效率和底层控制能力的同时,提供更高级别的抽象和面向对象的特性。引用是其中的一个特性,它可以提供更直观、简洁的语法来创建别名,并支持更自然的对象操作和传递。引用还可以用于实现更安全的代码,例如在函数参数传递中避免了空指针的问题。

  • 引用的引入是C++语言的一个重要特性,它使得代码更易于阅读、编写和理解。然而,引用也增加了语言的复杂性和额外的开销,因此在设计C语言时,为了保持简洁和效率,没有引入引用。
    创作不易 点赞支持 都进大厂~

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

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

相关文章

Linux系统运行时参数命令(性能监控、测试)(3)网络IO性能监控

目录 5. 网络IO性能监控5.1 性能指标5.2 网络信息5.2.1 网络配置5.2.2 套接字信息5.2.3 网络吞吐-sar命令5.2.4 连通性和延时 5.3 其他常用的网络相关命令5.3.1 telnet5.3.2 nc5.3.3 tcpdump5.3.4 lsof5.3.5 nmap 6.其他工具6.1 nmon性能监控6.2 glances系统监控 5. 网络IO性能…

Js提升:如何实现图片懒加载

知其然&#xff0c;更要知其所有然&#xff0c;在不同场景下该用什么方法&#xff0c;如何做到最优。 为什么要出现图片懒加载&#xff0c;解决了什么问题&#xff1f;除了懒加载&#xff0c;还有预加载呢&#xff1f;什么是预加载&#xff0c;怎么实现&#xff0c;相比于懒加载…

软件设计模式与体系结构-软件体系-层次软件体系结构

目录 四、层次软件体系结构简介代码两种方式的区别双向分层分层风格 VS 主程序-子过程风格&#xff1a;二者的不同层次软件体系结构的优点层次软件体系结构的缺点 课程作业 四、层次软件体系结构 层次之间存在接口&#xff0c;通过接口形成call/return的关系&#xff0c;上层是…

【内存优化】内存优化以及oom排查整体思路

linux疑难问题排查实战专栏&#xff0c;分享了作为公司专家&#xff0c;在解决内存、性能、各类死机等疑难问题的排查经验&#xff0c;认真学习可以让你在日后工作中大放光彩。 本文总结介绍了项目开发过程中oom排查和内存优化的一些方法&#xff0c;主要是从内存问题查看到堆内…

阿里云轻量服务器和ecs区别(最新更新)

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…

组合模式:如何设计实现支持递归遍历的文件系统目录树结构?

组合模式跟我们之前讲的面向对象设计中的“组合关系&#xff08;通过组合来组装两个类&#xff09;”&#xff0c;完全是两码事。这里讲的“组合模式”&#xff0c;主要是用来处理树形结构数据。这里的“数据”&#xff0c;你可以简单理解为一组对象集合&#xff0c;待会我们会…

使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

文章目录 前言1. 安装所需库2. 读取 Shapefile 文件3. 可视化地图4. 用户输入坐标和清除指定区域内的图形5. 可视化删除指定区域内的图形之后的地图6. 保存为新的 Shapefile (.shp)文件完整代码及解析分析说明 测试文件地址特别说明完结 前言 在地理信息系统&#xff08;Geogra…

力扣竞赛勋章 | 排名分数计算脚本

文章目录 力扣竞赛勋章介绍竞赛评分算法脚本&#xff08;本文的重点内容&#xff09;运行结果 代码修改自&#xff1a;https://leetcode.cn/circle/discuss/6gnvEj/ 原帖子的代码无法正常运行。 力扣竞赛勋章介绍 https://leetcode.cn/circle/discuss/0fKGDu/ 如果你想知道自…

【Elasticsearch】初识elasticsearch

目录 初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4.为什么不是其他搜索技术&#xff1f; 1.1.5.总结 1.2.倒排索引 1.2.1.正向索引 1.2.2.倒排索引 1.2.3.正向和倒排 1.3.es的一些概念 1.3.1.文档…

前端各种方法自我整理

Javascript方法 slice [slaɪs]切片 slice (-2)取出数组中倒数两个植变生成一个新数组 slice(0&#xff0c;3)取出数组下标0到下标3的值&#xff0c;生成新数组 includes [ɪnˈkluːdz]包含 查看数组或字符串内是否有该值&#xff0c;有返回true,无返回false 例子&#…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(十二)完结篇

今天开始使用 vue3 + ts 搭建一个项目管理的后台,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏…

linux常用压缩/解压缩命令的使用

目录 gzipbzip2tar gzip gzip 的常用选项&#xff1a; -l(list) 列出压缩文件的内容。 -k(keep) 在压缩或解压时&#xff0c;保留输入文件。 -d(decompress) 将压缩文件进行解压缩。 如果 gzip 不加任何选项&#xff0c;此时为压缩。压缩完该文件会生成后缀为.gz 的压缩文…

java读取excel,指定列A列为空,将下方空行上移,并将指定列F列数据拼接

java读取excel&#xff0c;将空行上移 改造前&#xff1a; 效果图&#xff1a; 上代码&#xff1a; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream; import java.io.FileOutputStream; import jav…

SqueezeNet算法解析—鸟类识别—Paddle实战

文章目录 一、理论基础1.前言2.设计理念2.1 CNN微架构&#xff08;CNN MicroArchitecture&#xff09;2.2 CNN宏架构&#xff08;CNN MacroArchitecture&#xff09;2.3 模型网络设计探索过程2.4 结构设计策略2.5 Fire模块 3.网络结构4.评估分析 二、实战1.数据预处理2.数据读取…

树莓派登录密码忘记了怎么办????

我们常常会不记得我们的密码&#xff0c;比如说我近期想玩一下我们树莓派开发版&#xff0c;登录的时候忘记了怎么办&#xff0c;第一想到的就是重刷系统&#xff0c;从头再来&#xff0c;今天我给大家带来了一个解决忘记了登录密码如何去修改它&#xff0c;从而进入系统里。 …

分享一款超级好用的下载软件,IDM--不限速,破解版,IDM破解版下载安装

本片文章分为四个部分&#xff1a; 第一部分&#xff0c;下载安装IDM 第二部分&#xff0c;IDM破解 第三部分&#xff0c;浏览器插件的安装 第四部分&#xff0c;百度网盘使用IDM下载 下载IDM 首先大家可以在浏览器搜索IDM 网址&#xff1a;https://www.internetdownloadma…

Zynq PS无法读取SD卡(TF卡)异常分析及如何读写SD卡

最近我正在进行一个Zynq项目&#xff0c;我使用了Xilinx SDK自带的系统库函数来读取SD卡中的配置信息。然而&#xff0c;一直读取异常。 我进行了一系列的调试和检查&#xff0c;包括确认PS部分的代码正确性以及Xilffs的配置是否正确&#xff0c;但是问题仍然没有解决。最后&am…

NYDIG最新报告:比特币今年上半年回报率达83.6%,远超其他资产类别

本文要点&#xff1a; 比特币的强劲势头延续到了二季度&#xff0c;本季度比特币上涨 6.8%&#xff0c;年初至今上涨 83.6%。 二季度末&#xff0c;一系列新的现货比特币 ETF 申请&#xff08;尤其是 ETF 巨头贝莱德的申请&#xff09;提振了比特币价格。 在多家机构提交现货 B…

POI下载excel通用方法

POI下载excel通用方法 最近遇到一个业务是需要下载excel&#xff0c;使用POI,这里记录一下实现过程 1、导包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency>…

本周大新闻|传微软曾考虑收购Niantic;腾讯引进Quest挑战重重

本周XR大新闻&#xff0c;AR方面&#xff0c;传微软曾考虑收购AR头部公司Niantic&#xff1b;Q-PIXEL公布5000PPI可调色Micro LED&#xff1b;三星智能眼镜商标曝光&#xff1b;Humane公布首款产品Ai Pin&#xff1b;空客推企业级AR解决方案。 VR方面&#xff0c;Vision Pro销…