指针与引用的区别

浅析C++中引用与指针的区别 引用和指针的概念及区别1.引用及指针概念指针概念引用概念2.引用与指针的区别 1.引用及指针概念 如果熟悉指针和引用的使用,就会感觉到指针和引用在很多场景使用起来还是有很大的相似性的,尽管它们在概念上是俩个完全不同的东西。 那么这二者之间到底具有怎样的相似性以及又有怎样的区别呢? 在谈这个话题之前我们先简单回顾一下指针和引用的概念: 指针概念 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的 阅读详情

指针与引用,在More   Effective   C++   的条款一有详细讲述   
    
  条款一:指针与引用的区别  
   
  指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?  
   
     
   
  首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。  
   
  “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”  
   
  char   *pc   =   0;                     //   设置指针为空值  
   
     
   
  char&   rc   =   *pc;                 //   让引用指向空值  
   
                                                 
   
  这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。  
   
     
   
  因为引用肯定会指向一个对象,在C里,引用应被初始化。  
   
  string&   rs;                           //   错误,引用必须被初始化  
   
  string   s("xyzzy");  
   
  string&   rs   =   s;                   //   正确,rs指向s  
   
     
   
  指针没有这样的限制。  
   
  string   *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   没有改变  
   
     
   
  总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。  
   
     
   
  还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。  
   
     
   
  vector<int>   v(10);               //   建立整形向量(vector),大小为10;  
   
                                                    //   向量是一个在标准C库中的一个模板(见条款35)    
   
  v[5]   =   10;                               //   这个被赋值的目标对象就是操作符[]返回的值  
   
     
   
  如果操作符[]返回一个指针,那么后一个语句就得这样写:  
   
  *v[5]   =   10;  
   
     
   
  但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用。(这有一个有趣的例外,参见条款30)  
   
     
   
  当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。而在除此之外的其他情况下,则应使用指针   

 

假设你有  
  void   func(int*   p,   int&r);  
   
  int   a   =   1;  
  int   b   =   1;  
   
  func(&a,b);  
   
  指针本身的值(地址值)是以pass   by   value进行的,你能改变地址值,但这并不会改变指针所指向的变量的值,  
  p   =   someotherpointer;   //a   is   still   1  
   
  但能用指针来改变指针所指向的变量的值,  
  *p   =   123131;   //   a   now   is   123131  
   
  但引用本身是以pass   by   reference进行的,改变其值即改变引用所对应的变量的值  
   
  r   =   1231;   //   b   now   is   1231

C++引用以及和指针的区别 阅读详情

相关推荐

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 426

引用和指针的区别

引用(reference)和指针(pointer)都是 C++ 中用来间接访问内存中对象的机制,但它们有一些重要的区别。以下是它们在语法、用法和特性上的详细区别。

2301_78622258的博客 4121

基于开源项目构建 CFS(网络靶场实战演练)平台

摘要:构建CFS网络靶场可使用多个开源组件组合,包括EVE-NG/GNS3或ContainerLab构建网络环境,Kasm提供工作空间,CALDERA+Atomic Red Team实现攻击模拟,DetectionLab建立防御环境,Malcolm/Arkime进行流量监控,CyRIS提供编排框架,Vulhub/DVWA创建漏洞靶标。关键在于通过API深度集成各组件,同时需注重安全隔离、资源规划及维护成本。建议开发统一管理平台,结合Ansible/Terraform实现自动化部署,打造定制化实战演练环境。(

深山技术宅的博客 1851

引用与指针的区别

int main() { int a = 10; int *p1 = &a; int& p2 = a; return 0; }

HUAERBUSHI521的博客 3万+

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2971

用R语言实现“中断时间序列分析” --- R code for ITS

ITS方法可用于评估一项干预措施的效果,从水平改变和斜率改变两个角度来描述干预引起的变化。

franksui的博客 4030

指针和引用的区别

 指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将最真实的一面展现给大家。如果我喷得不够好,希望嘴下留情、手下留命,还请指点一二;如果感觉还不错,请大家鼓掌。       1、指针和引用的定义       在深入介绍之前我们首先来看一下指针和引用的定义、指针和...

superwangxinrui的博客 2万+

TSMC40nmLP版图实战:从Design Rule解读到Cadence高效布局布线

本文详细解析了TSMC40nmLP工艺的版图设计实战,从Design Rule解读到Cadence高效布局布线技巧。重点介绍了40nm工艺中的关键设计规则,如最小线宽、间距规则和深N阱规则,并分享了Cadence Virtuoso中的高效工作流和射频模块设计技巧,帮助工程师提升版图设计效率和质量。

weixin_29250403的博客 378

指针与引用区别

非空区别:在任何情况下都不能使用指向空值的引用。引用必须总是指向某个对象。不存在指向空值的引用意味着引用的代码效率比使用指针的效率要高。 合法性区别:使用引用前不需要检测它的合法性。指针总是被检测,防止其为空。 可修改区别:指针可以被重新赋值以指向另一个不同对象,但是引用总是在初始化时被指定了绑定的变量,以后不能改变,也就是不能被重新赋值,但是其内容可以改变。 应用区别:在以下情况下应该使用...

Hustle Everyday 192

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 2002

告别环境配置烦恼:用Conda一键搞定GATK4、samtools、fastp等生信分析全家桶

本文介绍如何利用Conda快速搭建包含GATK4、samtools、fastp等工具的生物信息学分析环境,解决软件安装和版本冲突问题。通过详细的配置步骤和实战案例,帮助研究者十分钟内完成重测序分析全家桶的环境配置,显著提升上游分析效率。

weixin_30753873的博客 335

深度分析c++引用的本质以及引用与指针的区别

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟另外的内存空间进行存储,它与引用的变量共用的是同一块内存空间的地址。格式如下:类型& 引用变量名(对象名) = 引用实体;而此处的不是取地址操作符,而是起标志作用,标志所定义的标识符是个引用.int a = 1;int& b = a;//此处就是引用的定义return 0;此处就相当于变量a,b共用同一块内存地址空间。

kklovecode的博客 985

Cadence仿真MOS电容C-V曲线:从电路图到参数扫描的完整流程

本文详细介绍了使用Cadence Virtuoso仿真MOS电容C-V曲线的完整流程,从电路图绘制到参数扫描,再到结果分析与问题排查。通过实际案例和实用技巧,帮助工程师快速掌握MOS电容特性分析的关键步骤,提升集成电路设计效率。

weixin_29271263的博客 431

C++中引用和指针的区别

下面用通俗易懂的话来概述一下: 指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义: 引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义: 2、指针和引用的区别

Listening_music的专栏 9万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【引用】详解及指针和引用的区别

1、基本概念 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 2、特性 (1)&amp;在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。 (5)声明一个引用,不是新...

everthing willl be ok 599

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

指针和引用的区别以及引用与指针基础

C++中—指针和引用的区别&&引用&指针

学习-记录-分享创造价值 1937

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

指针和引用的区别_002_引用和指针

1. 引用1.1 引用即别名int 1.2 引用和其赋值//理解引用最好的方式:别名 2. 指针指针:指向另一种类型的符合类型,与引用类似,都是实现了对其它对象的简介访问。2.1 与引用的不同引用是另一个对象的别名,指针本身就是对象,允许对指针赋值和拷贝,而且指针的生命周期内它可以先后指向几个不同的对象指针无须再定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个...

weixin_39860583的博客 149

指针引用和引用指针的区别

c++在传参的过程中,指针()和指针引用(&)是有区别的。 虽然,我们往往可以通过传指针然后通过间址访问来修改指针所指向对象的值,同样,通过引用也可以直接修改对象的值。 但是,当传指针的时候有一个问题,就是,我们虽然可以通过指针来修改指针所指向对象的值,但是我们没有不能直接修改指针的内容(也就是指针变量存放的地址),因为函数传参时实际上是把该指针复制了一遍,虽然指针里面存放的地址还是我们原本那个对象的地址,但是指针变量却不是原来的指针变量了。 所以,当我们想要在函数里修改传过来的指针变量的地址的时候

Cieu的博客 1676

指针与引用的区别及易错点

本文系统比较了C++中指针与引用的核心区别:指针存储变量地址,可重新赋值且允许空值;引用作为变量别名,须初始化且不可更改绑定对象。关键差异体现在内存占用(指针独立存储地址,引用通常被优化)、使用场景(指针适合动态/可能为空的情况,引用适合避免拷贝)和操作特性(指针支持算术运算,引用直接访问)。常见易错点包括指针的空解引用、野指针问题,以及引用的悬空引用风险。正确选择取决于需求:优先引用确保安全简洁,需要灵活性时选择指针。理解这些差异有助于编写更安全高效的C++代码。

2403_87884412的博客 917
上一篇: 怎样在插入一条记录的同时,立即返回刚插入如记录的ID值
下一篇: COM和套间(Apartments) 1 - 基本知识
Devillyd
博客等级 码龄23年 58粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值