C++ 引用和指针有什么区别?
引用和指针有什么区别?
本质:引用是别名,指针是地址,具体的:
①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。
注:标准没有规定引用要不要占用内存,也没有规定引用具体要怎么实现,具体随编译器 http://bbs.csdn.net/topics/320095541
③ 从编译上看,程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说引用可以被认为是不能改变的指针。
④不存在指向空值的引用这个事实,意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
⑤理论上,对于指针的级数没有限制,但是引用只能是一级。如下:
int** p1; // 合法。指向指针的指针
int*& p2; // 合法。指向指针的引用
int&* p3; // 非法。指向引用的指针是非法的
int&& p4; // 非法。指向引用的引用是非法的
注意上述读法是从左到右。
注意:正因为指针可以不指向任何对象,使用指针之前必须做判空操作,而引用就不必。
最后,引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;
具体指没有int& const a这种形式,而const int& a是有的,前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查)
C++ 引用和指针有什么区别?相关推荐
- 引用与指针有什么区别?
引用与指针有什么区别? 指针和引用都是地址的概念,指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. 程序为指针变量分配内存区域,而不为引用分配内存区域. 指针使用时要在前加 * ,引 ...
- 引用和指针概念及区别
一.引用和指针 指针:指针是一个特殊的变量,它里面存储的的数值为内存里的一个地址,通过*访问内存地址所指向的值 引用:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存 ...
- 浅谈C/C++引用和指针的联系和区别
为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...
- 每日一题(28)—— 引用与指针的区别
引用与指针有什么区别? (1)引用必须被初始化,指针不必: (2)引用初始化以后不能被改变,指针可以: (3)不存在指向空值的引用,但是存在指向空值的指针.NULL.
- 【C语言】引用和指针的区别?
首先解释在C语言中,什么是引用: 1.引用概念 引用是别名,必须在声明的时候初始化.即:是指一个已定义变量的别名.(一个内存空间,有两个名字都可以操作) 引用:在函数调用时,是变量的别名,不可以单独 ...
- c++引用与指针的区别
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需 ...
- C 引用和指针的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 指针和引用的定义和性质区别: 指针:指针是一个变量,只不过这个变量存储的是一个地址,指向 ...
- 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
引用和指针的区别 (1) 引用在创建的同时必须初始化,即引用到一个有效的对象:而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值. (2) 不存在NULL引用,引用必须与合法的存储单元关联 ...
- C++中 *(指针引用)与*(指针)的区别
转自:http://blog.sina.com.cn/s/blog_673ef8130100imsp.html 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调函数的形式参 ...
最新文章
- 用74l138实现一个一位全减器_用pygame实现一个简单的五子棋游戏
- Ubuntu16.04 Table无法自动补全
- 用 API 提取、写入指定网站的 Cookie - 回复 bangrj 的问题
- 《Windows via C/C++》学习笔记 —— Windows 线程池
- R语言 scorecard包 评分卡
- 第十届蓝桥杯java B组—试题I 后缀表达式
- stm32f103rb升级到stm32f103rc时代码移植注意事项
- NULL和INITIAL的区别 and database interface
- 数据结构排序系列详解之二 希尔排序
- webots自学笔记(七)通过定义顶点构件3D形状(IndexedFaceSet节点)
- 浅谈大数据思维——一名管科类学生基于《大数据时代》的思考
- VisualStudio2017编写masm32汇编程序以及语法高亮配置
- 蛇行字符串解题代码C++
- springboot无法打开 jsp 页面变成下载解决办法
- xiaopiu怎么导出html,聊聊xiaopiu那些鲜为人知的惊喜功能(进阶篇)
- 【做人:一,性格和习惯的重要性[转载]】
- flutter 显示表情
- Verilog代码设计之时分复用
- Mathematica中数据类型的互换——实数(即小数)to有理数(即分数),有理数(即分数)to实数(即小数)
- 数据分享 | 全球水系流域河流湖泊污水处理河流类型矢量数据