引用(类名后加符号)和指针的区别

news/2025/3/28 8:07:20/

它们的区别:
①从现象上看,

指针在运行时可以改变其所指向的值

而引用一旦和某个对象绑定后就不再改变

这句话可以理解为:

指针可以被重新赋值以指向另一个不同的对象

但是引用总是指向在初始化时被指定的对象,以后不能改变

但是指定的对象其内容可以改变


② 从内存分配上看,

程序为指针变量分配内存区域

不为引用分配内存区域

因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。


③ 从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。


④不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。


⑤理论上,对于指针的级数没有限制,但是引用只能是一级。如下:
  int** p1; // 合法。指向指针的指针
  int*& p2; // 合法。指向指针的引用
  int&* p3; // 非法。指向引用的指针是非法的
  int&& p4; // 非法。指向引用的引用是非法的


http://www.ppmy.cn/news/1209267.html

相关文章

node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)

前言 提示:使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档:http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码(连接mongodb 服务)3.…

轻松下载网页音频和视频

在网页上看到好看的视频或者听到的音乐想保存,让我来教你(仅供学习) 注意:有极少部分的网站视频经过加密,无法下载 一、视频下载 1.打开视频网页 2.右键“检查” 3.刷新网页 4.按照下图中步骤操作 5.把复制的链接放…

LeetCode算法题解(回溯,难点)|LeetCode37. 解数独

LeetCode37. 解数独 题目链接:37. 解数独 题目描述: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分…

使用Appium Inspector定位web元素 switchContext时报错

在使用Appium Inspector调试hybrid应用时,发现工具栏的switch context不能正确切到WEBVIEW的context,报错 An unknown server-side error occurred while processing the command. Original error: invalid argument: cannot parse capability: goog:ch…

让你认识C++中的模板

目录 一. 泛型编程1、定义 二、函数模板1、定义2、格式3、函数模板的实例化(1)、强制转化(2)、显式实例化 三、类模板1、 类模板的定义格式2、实例3、 类模板的实例化 一. 泛型编程 1、定义 泛型编程:编写与类型无关…

Leetcode—637.二叉树的层平均值【简单】

2023每日刷题(二十五) Leetcode—637.二叉树的层平均值 BFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ /*** Note: The returned array mu…

if...else绝佳替换方案

目录 方法一:提前 return方法二:枚举方案三:Optional 判空方案四:表驱动法方案五:策略模式 工厂方法方案六:责任链模式方案七:Function 方法一:提前 return 假如有如下代码&#x…

关于Android Studio中开发Flutter配置

配置系统环境变量:path下 ,flutter的bin目录下 File->Settings->Languages&Frameworks->FlutterFile->Settings->Languages&Frameworks->DartFile->Settings->Languages&Frameworks->Android SDK 确认是…