C++引用与指针的比较

引用是C++中的概念,初学者容易把引用和指针混淆一起。以下程序中,n是m的一个引用(reference),m是被引用物(referent)。

int m;

int &n = m;

n相当于m的别名(绰号),对n的任何操作就是对m的操作。例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

引用的一些规则如下:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。

int i = 5;

int j = 6;

int &k = i;

k = j;  // k和i的值都变成了6;

上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。

void Func1(int x)

{

x = x + 10;

}

int n = 0;

Func1(n);

cout << “n = ” << n << endl;  // n = 0

以下是“指针传递”的示例程序。由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。

void Func2(int *x)

{

(* x) = (* x) + 10;

}

int n = 0;

Func2(&n);

cout << “n = ” << n << endl;      // n = 10

以下是“引用传递”的示例程序。由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10。

void Func3(int &x)

{

x = x + 10;

}

int n = 0;

Func3(n);

cout << “n = ” << n << endl;      // n = 10

对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?

答案是“用适当的工具做恰如其分的工作”。

指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?

如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。

C++引用与指针的比较相关推荐

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

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

  2. 同时用引用和指针 int *a;

    同时用引用和指针可以吗? 见到一个这样的声明 int *&a: 这是什么意思? a 是一个 指向 int* 的引用. 你可以了解一下右左法则,读复杂类型声明(当然,这个int*& a还 ...

  3. [C++再学习系列] 引用和指针

    下面是网上关于引用和指针区别的常见答案: 引用和指针有如下三种区别: 1 引用必须在声明时初始化,而指针不用: 2 NULL不能引用,而指针可指向NULL: 3 引用一旦声明,引用的对象不能改变(但对 ...

  4. C 引用和指针的区别

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

  5. 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )

    文章目录 I . 引用概念 II . 引用声明 III . 引用 地址 内存 分析 IV . 常引用 V . 引用作为参数 VI . 引用 与 指针 对比 I . 引用概念 C++ 对 C 扩充 : ...

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

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

  7. 引用与指针的异同-基础篇

    引用与指针的异同 1. 指针和引用的实质 同:都指向变量的内存地址 异:指针是地址变量:引用是地址常量 2. 指针和引用的内存分配情况 指针分配单独的内存空间,存放指向的变量的地址:引用仅是变量的别名 ...

  8. 面向对象简述--对象、引用、指针

    类和成员对象 [定义类] (1)两个重要概念: 类(class):类是某一批对象的抽象,可以把类理解成某一种概念. 对象(object,也被称为实例,instance):对象才是一个实际存在的实体. ...

  9. C++中引用和指针的不同

    引用,其本质就是指针,将它用在一些特别的场合,会比指针更简洁,更方便.具体说来,指针多用于动态内存管理和对数组的操作等,C风格的代码接收和返回指针:引用则往往用在接收和返回类类型的名字空间域函数或类域 ...

  10. 函数名称前面加引用“”或指针符号“*”的意思

    函数名称前面加引用"&"或指针符号"*"的意思 http://blog.csdn.net/qq_38124695/article/details/781 ...

最新文章

  1. java io字符输出流_Java字符输入输出流
  2. 黑电平校正、FPN校正、平场校正、白平衡校正
  3. mysql实现vpd_基于JDBC实现VPD:SQL解析篇
  4. leetcode——Lowest Common Ancestor of a Binary Tree
  5. String s1=new String(“abc“); 和String s1=“abc“区别
  6. java.lang中String=和equals()函数解析
  7. Linux 下 Tomcat Https
  8. wpf项目无法使用针式打印机_针式打印机更换色带芯
  9. linux awk,sort,uniq,wc,cut命令详解
  10. 两个集合根据属性取差集_SQL高级知识——集合
  11. 【过程记录】ArcGIS Pro打开.osgb文件
  12. 【已经解决】网页按F12转开发者模式,看不到请求头Headers信息
  13. 使用visual studio2015 社区版开发office
  14. r矢量球坐标系旋度_唯心识学075·如何理解三维直角坐标系中的旋度表达式
  15. Alcohol Sensor(1)
  16. 无情未必真豪杰,怜子如何不丈夫——愿天下有情人终成眷属
  17. css中clip:rect用法
  18. 【愚公系列】2022年09月 微信小程序-three.js绘制正方体
  19. nginx调优(一)
  20. 华北电力计算机专业排名,华电考研计算机专业排名

热门文章

  1. C#将子窗体填充到父窗体的panel中
  2. Windows 下mysqldump备份1045错误解决办法
  3. 【长沙集训】2017.10.28
  4. Android属性动画之ObjectAnimator控制
  5. c++界面设计皮肤工具
  6. K2 Blackpearl中从数据库直接删除流程实例之K2Server表
  7. repo + gerrit
  8. IE10 URL中多出一串字符,图片无法显示
  9. [误将两块磁盘挂载到根目录][解决办法]
  10. HTML字符实体大全