C++引用与指针的比较
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++引用与指针的比较相关推荐
- c++引用与指针的区别
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指针需 ...
- 同时用引用和指针 int *a;
同时用引用和指针可以吗? 见到一个这样的声明 int *&a: 这是什么意思? a 是一个 指向 int* 的引用. 你可以了解一下右左法则,读复杂类型声明(当然,这个int*& a还 ...
- [C++再学习系列] 引用和指针
下面是网上关于引用和指针区别的常见答案: 引用和指针有如下三种区别: 1 引用必须在声明时初始化,而指针不用: 2 NULL不能引用,而指针可指向NULL: 3 引用一旦声明,引用的对象不能改变(但对 ...
- C 引用和指针的区别
指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 指针和引用的定义和性质区别: 指针:指针是一个变量,只不过这个变量存储的是一个地址,指向 ...
- 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )
文章目录 I . 引用概念 II . 引用声明 III . 引用 地址 内存 分析 IV . 常引用 V . 引用作为参数 VI . 引用 与 指针 对比 I . 引用概念 C++ 对 C 扩充 : ...
- 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
引用和指针的区别 (1) 引用在创建的同时必须初始化,即引用到一个有效的对象:而指针在定义的时候不必初始化,可以在定义后面的任何地方重新赋值. (2) 不存在NULL引用,引用必须与合法的存储单元关联 ...
- 引用与指针的异同-基础篇
引用与指针的异同 1. 指针和引用的实质 同:都指向变量的内存地址 异:指针是地址变量:引用是地址常量 2. 指针和引用的内存分配情况 指针分配单独的内存空间,存放指向的变量的地址:引用仅是变量的别名 ...
- 面向对象简述--对象、引用、指针
类和成员对象 [定义类] (1)两个重要概念: 类(class):类是某一批对象的抽象,可以把类理解成某一种概念. 对象(object,也被称为实例,instance):对象才是一个实际存在的实体. ...
- C++中引用和指针的不同
引用,其本质就是指针,将它用在一些特别的场合,会比指针更简洁,更方便.具体说来,指针多用于动态内存管理和对数组的操作等,C风格的代码接收和返回指针:引用则往往用在接收和返回类类型的名字空间域函数或类域 ...
- 函数名称前面加引用“”或指针符号“*”的意思
函数名称前面加引用"&"或指针符号"*"的意思 http://blog.csdn.net/qq_38124695/article/details/781 ...
最新文章
- java io字符输出流_Java字符输入输出流
- 黑电平校正、FPN校正、平场校正、白平衡校正
- mysql实现vpd_基于JDBC实现VPD:SQL解析篇
- leetcode——Lowest Common Ancestor of a Binary Tree
- String s1=new String(“abc“); 和String s1=“abc“区别
- java.lang中String=和equals()函数解析
- Linux 下 Tomcat Https
- wpf项目无法使用针式打印机_针式打印机更换色带芯
- linux awk,sort,uniq,wc,cut命令详解
- 两个集合根据属性取差集_SQL高级知识——集合
- 【过程记录】ArcGIS Pro打开.osgb文件
- 【已经解决】网页按F12转开发者模式,看不到请求头Headers信息
- 使用visual studio2015 社区版开发office
- r矢量球坐标系旋度_唯心识学075·如何理解三维直角坐标系中的旋度表达式
- Alcohol Sensor(1)
- 无情未必真豪杰,怜子如何不丈夫——愿天下有情人终成眷属
- css中clip:rect用法
- 【愚公系列】2022年09月 微信小程序-three.js绘制正方体
- nginx调优(一)
- 华北电力计算机专业排名,华电考研计算机专业排名