引用和指针有什么区别?

本质:引用是别名,指针是地址,具体的:

①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变。
②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对象。引用不能指向空值。
注:标准没有规定引用要不要占用内存,也没有规定引用具体要怎么实现,具体随编译器 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++ 引用和指针有什么区别?相关推荐

  1. 引用与指针有什么区别?

    引用与指针有什么区别? 指针和引用都是地址的概念,指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. 程序为指针变量分配内存区域,而不为引用分配内存区域. 指针使用时要在前加 * ,引 ...

  2. 引用和指针概念及区别

    一.引用和指针 指针:指针是一个特殊的变量,它里面存储的的数值为内存里的一个地址,通过*访问内存地址所指向的值 引用:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存 ...

  3. 浅谈C/C++引用和指针的联系和区别

    为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...

  4. 每日一题(28)—— 引用与指针的区别

    引用与指针有什么区别? (1)引用必须被初始化,指针不必: (2)引用初始化以后不能被改变,指针可以: (3)不存在指向空值的引用,但是存在指向空值的指针.NULL.

  5. 【C语言】引用和指针的区别?

    首先解释在C语言中,什么是引用:  1.引用概念 引用是别名,必须在声明的时候初始化.即:是指一个已定义变量的别名.(一个内存空间,有两个名字都可以操作) 引用:在函数调用时,是变量的别名,不可以单独 ...

  6. c++引用与指针的区别

    ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需 ...

  7. C 引用和指针的区别

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 指针和引用的定义和性质区别: 指针:指针是一个变量,只不过这个变量存储的是一个地址,指向 ...

  8. 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?

    引用和指针的区别 (1) 引用在创建的同时必须初始化,即引用到一个有效的对象:而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值. (2) 不存在NULL引用,引用必须与合法的存储单元关联 ...

  9. C++中 *(指针引用)与*(指针)的区别

    转自:http://blog.sina.com.cn/s/blog_673ef8130100imsp.html 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调函数的形式参 ...

最新文章

  1. 用74l138实现一个一位全减器_用pygame实现一个简单的五子棋游戏
  2. Ubuntu16.04 Table无法自动补全
  3. 用 API 提取、写入指定网站的 Cookie - 回复 bangrj 的问题
  4. 《Windows via C/C++》学习笔记 —— Windows 线程池
  5. R语言 scorecard包 评分卡
  6. 第十届蓝桥杯java B组—试题I 后缀表达式
  7. stm32f103rb升级到stm32f103rc时代码移植注意事项
  8. NULL和INITIAL的区别 and database interface
  9. 数据结构排序系列详解之二 希尔排序
  10. webots自学笔记(七)通过定义顶点构件3D形状(IndexedFaceSet节点)
  11. 浅谈大数据思维——一名管科类学生基于《大数据时代》的思考
  12. VisualStudio2017编写masm32汇编程序以及语法高亮配置
  13. 蛇行字符串解题代码C++
  14. springboot无法打开 jsp 页面变成下载解决办法
  15. xiaopiu怎么导出html,聊聊xiaopiu那些鲜为人知的惊喜功能(进阶篇)
  16. 【做人:一,性格和习惯的重要性[转载]】
  17. flutter 显示表情
  18. Verilog代码设计之时分复用
  19. Mathematica中数据类型的互换——实数(即小数)to有理数(即分数),有理数(即分数)to实数(即小数)
  20. 数据分享 | 全球水系流域河流湖泊污水处理河流类型矢量数据

热门文章

  1. mysql 正则regrx_正则表达式
  2. python学习与数据挖掘_python机器学习与数据挖掘
  3. win10隐藏linux,Win10如何隐藏Windows Defender任务栏图标
  4. cad在哪里设置图幅大小_CAD教程之如何设置十字光标大小及颜色
  5. 软考网络管理员学习笔记6之第六章互联网技术
  6. Linux学习资源汇总
  7. 周计划1[7.22~7.28]
  8. CSS浮动(Float)(二)
  9. canvas路径剪切和判断是否在路径内
  10. Java中堆内存和栈内存详解(转)