指针和引用区别

news2024/11/19 16:41:29

目录

指针

指针类型

野指针

二级指针

Const修饰指针

引用

引用的作用

常引用

引用和指针的对比

引用能够完全替换指针吗?


指针

        指针是C语言中的概念,它是指计算机储存内容的地址。指针它的值指向存在电脑储存器中另一个地方的值。通过地址能找到的所需的变量单元,即地址指向改变量单元。因此,讲地址形象化的称为“指针”。意思是通过他能找到以他为地址的内存单元(然后可以更改改内存单元中储存的内容)。

指针变量大小:32位机器:4字节,64位机器:8字节

指针类型

        由于指针表示指向计算机存储内容的地址,所以指向的内容不同就分出了很多不同的指针类型,比如指向整形就被称为整形指针、指向函数地址的就被称为函数指针、指向数组的指针被称为数组指针等

        指针类型就决定了我们后续进行解引用操作时,可以访问的空间大小。比如char*能访问1个字节,int*能够访问4个字节,double*能够访问8个字节。

        指针类型也决定了:指针一步走多远(指针的步长)。比如:char*类型的指针变量+1,地址+1;int*类型的指针变量+1,地址+4。

野指针

        野指针:是指针指向的位置是不可知的、随机的。

野指针出现原因

        1.指针变量没有初始化(即没有赋值给指针变量)

        2.指针越界访问:当指针指向的范围超出了原先设定的范围,则会出现野指针,比如使用数组指针时访问超出了数组的范围。
        3.指针指向的内存被释放。比如我们在一个函数中把一个局部变量的地址给储存起来了。但是当我们退出函数后,局部变量会被删除,就算我们储存了局部变量的地址,但这个地址实际上在函数结束又返还给了内存,此时这个指针就变为了野指针。  

        如下图所示,我们定义的int类型的arr数组,总共只有10个元素,我们用p来指向这个arr数组的元素位置,但是当i=11时,我们指针就超过了arr数组指定的范围,即越界访问,这时就会产生野指针。

如何避免野指针?

  1. 指针创建时要初始化,若真不知道赋给指针变量什么值,就可以先赋值NULL/nullptr(空指针)
  2. 小心指针越界(越界时,系统会崩溃,假如系统崩溃,可以看看是否指针越界)
  3. 指针指向的空间释放后,给其赋值NULL。即指针不用的时候就赋值NULL空指针(注意NULL空指针不能访问)
  4. 指针试用前先检查有效性

二级指针

         二级指针:就把一级指针的地址存起来,(一级指针存变量的地址)。一个*就是一级指针,**就是二级指针。可以依次往上递增,同理***存放二级指针的地址,称为3级指针。

        注意:多级指针解引用访问时也要解多次。

Const修饰指针

        当const在类型前面,修饰的是指针变量num所指向的内容,如 const int* num。此时const修饰的是指针变量num所指向的内容,表示指针变量 num 所指向的内存单元里面的内容不可变,指针变量num是可变的,可以改变,指向其他地址。

        当const修饰指针变量时,如 int* const num此时 const 修饰的是指针变量 num,所以指针变量 num 不可变,指针变量num所指向的内容可变。

        方便记法:

        const int* num:num先与*结合,*num表示一个int类型,*num不可变

        int* const num:num先与const结合,在解引用,表示num不可变

引用

        引用是C++中的概念,在C++中我们可以给变量取别名,这个操作就叫引用。使用方法:类型& 新变量名=旧变量名。如下图所示,打印的&b和&a,打印a和b的地址,会是同个地址,下面b++也会让a++,a++也会让b++,最终a=b=2

引用特性:

  1.         1.引用(取别名)可以对一个变量重复使用,也可以对一个别名再引用。
  2.         2.引用必须在其初始化时就使用,不能先创建一个引用在让引用指向其他值。
  3.         3.引用定义后不能改变指向。
  4. 注意:取别名的前提是不能放大权限。如果一个变量原来是const修饰的,那就不能用普通的引用来引用它,要用常引用。

  5. 引用的作用

    1.         做函数参数(输出型参数,参数会改变后返回)。在C语言中我们函数若要改变传参的值,传参必须传递地址,接收改变也必须都用指针。而在C++中,我们可以用引用作为函数的传参,这些形参就不是原参数的零时拷贝,而是原参数的别名,改变别名的值也会影响原参数。如果传参过大,引用也能减少空间的浪费,提高代码效率(以上功能指针都能实现,但是引用更简单)。

    2. 引用做函数参数的作用:1.做输出型参数,2.减少拷贝量,提高效率。

      1.         函数返回值,可修改返回值。注意:当引用做函数返回值时,不能返回局部变量的引用。当使用static修饰的全局变量或者malloc开辟的变量(一个不会随着函数结束而被回收的变量),这些都可以用引用返回,然后对返回的变量修改。

        1. 引用做函数返回值的作用:1.修改返回值(不是局部变量),2.减少拷贝量,提高效率。

          常引用

                  常引用,即在类型前面加上const,用于我们需要用到引用,但又不想改变引用的值的情况。在后面的拷贝构造函数中,我们需要用到引用来传参,但又不想引用的参数被改变,所以就用const。

                  常引用引用的对象可以是常量或者表达式。注意:表达式不能用普通的引用来引用,因为一个表达式的结果是一个临时变量,具有常属性,要引用的话只能用常引用。

                  整形提升/截断时产生的零时变量也具有常属性,可以被常引用引用。例如下图:

常引用是一种权限的缩小,只读,不写不改。

引用和指针的对比

引用和指针的不同点:

  1.         1.语法上引用是别名,不开空间;而指针是地址,需要开空间存地址。底层中引用和指针都会开辟空间(从汇编层面看,引用底层是用指针实现的)。
  2.         2.别名必须初始化给一个值,指针可以不初始化(指针不初始化可能会有野指针,但不用就行)。
  3.         3.指针可以改变指向,引用不行。
  4.         4.因为上面两个原因,所以引用相对安全,没有空引用,但有空指针。有野引用(函数返回值用引用,返回局部变量,局部变量被收回后导致出现野引用),也有野指针,但是野引用不常见,而野指针很容易出现。
  5.         5.引用和指针在sizeof中含义不同,sizeof(指针)返回值只有4/8(返回大小只跟操作系统位数有关),sizeof(引用)返回的是引用的类型大小。
  6.         6.加减:引用自加是引用实体加1,指针自加是往后偏移一个类型的大小。
  7.         7.有多级指针,但没有多级引用
  8.         8.指针要访问到实体需要解引用,引用可以直接访问到实体(编译器自己会处理引用)
    1. 引用能够完全替换指针吗?

              在C++中,引用不能完全替代指针。因为指针可以重新指向新的地址,而引用不行。引用只是对一些使用指针比较复杂的地方进行替代、优化,使代码更简单易懂。比如链表、二叉树都还是需要指针去连接。Java、Python都没有指针,只有引用,但它们的引用是可以重新改变指向的,所以不需要使用指针。

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

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

相关文章

玩机搞机基本常识-----如何在 Android 中实现默认开启某个功能 修改方法列举

我们有时候需要对安卓系统进行修改。实现其中的某些功能。让用户使用得心应手。节约时间。那么如果要实现系统中的有些功能选项开启或者关闭。就需要对系统有一定的了解。那么在 Android 中实现默认开启某个功能可以通过以下几种方式: 一、在应用的设置中添加选项 …

Chromium 中js Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现(一)-CSDN博客 接着上一篇继续介绍调用,上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484, 2、打开vs附加上此进程ID12484 3、点击页面测…

uni-app 开发的应用快速构建成鸿蒙原生应用

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,它支持编译到 iOS、Android、小程序等多个平台。对于 HarmonyOS(鸿蒙系统),uni-app 提供了特定的支持,允许开发者构建鸿蒙原生应用。 一、uni-app 对 HarmonyOS 的支…

分治算法(7)_归并排序_计算右侧小于当前元素的个数

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 分治算法(7)_归并排序_计算右侧小于当前元素的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论&…

公司防泄密软件哪个好?6款公司内部文件防泄密软件,2024超好用推荐!

企业的核心机密就如同生命之源,然而,数据泄露的风险也随之而来,让不少企业头疼不已。 面对这一挑战,选择一款高效、可靠的防泄密软件显得尤为重要。 那么,公司防泄密软件哪个好? 接下来,就让我…

攻防世界---->[简单] 初识RSA

做题笔记。 下载 是一个.py的文件。 用 Notepad打开瞅瞅。 分析: L (p-1)*(q-1) dgmpy2.invert(e,L) 求逆元快速算出来:invert(e,φ(N)) 求出d值。 n p*q pq p*(q-1) qp q*(p-1) L 【q*(p-1) * p*(q-1)】 // p*q >>> (p-1)*(…

C++关于树的基础知识

首先区分概念 “度为m的树”指的是至少有一个结点的度是m,一定是非空树 “m叉树”指的是允许所有的结点都小于m,且可以是空树 常见考点: 度为m的树的第i层最多有个结点 (对于m叉树也相同) 第一层m的0次方 第二层m的…

如何帮助企业进行有效的专利管理?

专利管理是企业创新发展的重要支撑,有效的专利管理不仅能保护企业的创新成果,还能提升企业的核心竞争力。那么,究竟该如何帮助企业进行有效的专利管理呢?接下来,本文将为您详细解答。 一、专利管理对企业的重要性 1. 保…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题,但是鉴于网上解决方法基本没有,故记录下来帮助后来者。整篇文章总结下来就是一句话:PyQt5和sip安装过程或安装版本有问题,需要重新安装。 问题与解决方法 如果PyQt5你是正…

华为OD机试 - 处理器问题(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

一文了解:LLM Dropout

咱们来聊聊,啥样的预测模型才算是好模型?简单来说,就是那种在处理它从没见过的数据时,也能表现得特别棒的模型。老派的泛化理论告诉我们,要想让模型在训练集和测试集上都表现差不多,就得让模型简单点。这个…

以一个B站必剪应用Bug过一下CVSS 4.0评分

Bug的内容就是Mac上的必剪无法完成B站视频上传新手任务。 这个从B站客服那里确认了。 没多大事儿,这是个设备相关的bug,我们也可以认为这样的小bug对用户是无害的,此时评分为0,无影响,但从学习角度出发我们将部分评分提高到L,也就是假设这是个CVE的话,聊一下安全问题。…

为什么推荐你一定要弄懂千门八将108局,学会做局思维的人有多么的厉害?

在纷繁复杂的社会与商业环境中,能够洞悉事物本质、预见趋势并巧妙布局的人,往往能在竞争中脱颖而出,成为时代的弄潮儿。而“千门八将108局”这一古老而深邃的智慧体系,不仅蕴含了中国传统文化中对于策略、心理学、人际交往的深刻理…

Java 集合实现类

Java 集合实现类 ​ Java 提供了一套实现了 Collection 接口的标准集合类。其中一些是具体类,这些类可以直接拿来使用,而另外一些是抽象类,提供了接口的部分实现 序号类描述1AbstractCollection 实现了大部分的集合接口。2AbstractList 继承…

java中日期时间类的api

目录 1. Instant 类 构造方法 1)Instant.now():获取当前时间戳。 常用方法 1)plus(Duration duration) 2)minus(Duration duration) 3)toEpochMilli() 4)ofEpochMilli(long epochMilli) 5)案例:…

网站建设公司哪家好?好的网站建设公司应该有哪些特别之处?

面对众多的网站建设公司,企业该如何选择呢?如何才能避坑呢?本文将探讨好的网站建设公司应该具备的特别之处 案例,这是最直观的表现,一个好的网站建设公司必然拥有为数众多的的案例展示,且这些案例质量高&a…

基于resnet网络【系列】多类别图像识别、迁移学习:猫狗分类实战

目录 1、前言 2、resnet 猫狗分类实战 2.1 训练 2.2 推理 3、更换数据集训练 1、前言 ResNet(残差网络)是一种深度卷积神经网络架构,广泛用于图像分类任务。它是由微软研究院的研究人员于2015年推出的,以其通过使用残差连接…

Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)

引言 想象一下,只要描述你想要的画面,电脑就能帮你画出来。这在几年前还像是科幻小说里的场景,但随着神经网络和潜在扩散模型(LDM)技术的发展,现在已经成为可能。OpenAI 推出的 DALLE 工具,因其…

vue项目刷新后h5样式失效

vue项目刷新后h5样式失效 今天遇到一个bug,有一个Element的message组件,用它做的一个进度条,它是写在一个页面上,并且是用js控制dom元素的 web端一切正常,h5如果从别的页面跳过来也正常,但是,H…

服装生产管理:SpringBoot框架的高效策略

5 系统的实现 5.1 登录界面的实现 用户要想进入本系统必须进行登录操作,进入对应角色登录界面,在登录界面输入系统账号、登录密码,选择登录类型,点击登录按钮进行登录系统,管理员登录界面展示如图5-1所示&#xff0c…