问题1:指针与引用有什么区别?
等级:初级
指针(Pointer)持有另一个对象的地址,使我们能够间接地操作这个对象。引用(Reference)有时候又称为别名,它可以用作对象的另一个名字。它们都是让你间接引用其他对象。
从语法的角度比较,二者主要区别如下:
1) 指针用操作符“*”和“->”,引用使用操作符“.”。
2) 引用在创建的同时必须初始化,即引用到一个有效的对象;而指针在定义的时候可以不初始化,在定义后面的任何地方重新赋值。
3) 指针可以被重新赋值以指向另一个不同的对象。但是,引用则总是指向在初始化时被指定的对象,以后不能改变。
4) “sizeof(引用)”得到的是所指向对象的大小,而“sizeof(指针)”得到的是指针本身的大小。
5) 指针和引用的加法(+)、减法(-)、自增(++)、自减(--)等运算意义不一样。
6) 引用不支持引用数组,指针支持指针数组。
深入讨论:
上述答案可能不够完整,但是基本覆盖了指针和引用的主要区别。可能一些读者还想添加如下两个区别:
1) 不存在NULL引用,引用必须与合法的存储单元关联,而指针则可以是NULL。
2) 程序为指针变量分配内存区域,而引用不分配内存区域。
对此,我不敢苟同。
首先,我们来看看是否存在NULL引用。C++不允许将引用初始化为NULL,所以如下的代码无法通过编译:
char& rc = NULL; // 让引用指向空值
|
但是,使用如下代码,我们就可以创建一个NULL引用,该代码的执行结果将是不确定的。
char *pc = 0; // 设置指针为空值
char& rc = *pc; // 让引用指向空值
|
接着,让我们看看程序是否为引用分配内存区域呢?C++标准并没有对此作出规定,所以我认为这完全取决于编译器,我们不能武断地说程序会或不会为引用分配内存区域。
对于上述指针和引用区别中的第三点,我们可以以另外一种方式来陈述:引用全部是const类型,它总是指向在初始化时被指定的对象;指针有const类型。让我们借用《C++ FAQ》第二版章节11.13中的示例来解释一下这句话。
class Fred { };
void f(Fred& const a);
void g(const Fred& const a);
void sample(Fred& a)
{
Fred& const b = a;
const Fred& const c = a;
}
|
如果在Visual Studio 2008中编译上述代码,你会得到警告信息“anachronism used : qualifiers on reference are ignored”。如果希望去掉该警告信息,我们可以对代码进行如下修改。
class Fred { };
void f(Fred& a);
void g(const Fred& a);
void sample(Fred& a)
{
Fred& b = a;
const Fred& c = a;
}
|
如果使用gcc,你会得到一些错误信息,该程序将无法通过编译。
参考资料:
《More Effective C++》条款1。
《C++ Primer》第四版章节3.2和3.6。
《C++ FAQ》第二版第11章。
分享到:
相关推荐
2.1.2 引用与指针有什么区别?
指针和引用的区别详细解答! 指针和引用的区别总结 1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变 2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域...
详细分析了指针与引用的区别,适合初学者了解
C++指针与引用,专门讲述c++中指针与引用的区别与使用。
在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象...
简单解释指针与引用的区别 指针:普通指针可以多次被赋值,也就是说可以多次更改它所指向的对象; 引用:只能在初始化时指定被引用的对象,其后就不能更改。
一份总结“指向指针的指针和引用指针变量区别”的精华笔记,很多人对于**p与 *&p的差别不是很清楚,相信这个笔记可以解决你的疑惑。
C++重要的谨记指针和引用的区别,学好C++。
该demo主要展现智能指针和引用计数的实现过程,总共两个类,一个智能指针类,一个引用计数类,另外附一份执行步骤资料
详细介绍了C++中通过指针和通过引用传递参数的区别
深入理解引用与指针的关系从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被...
该文档给出两个关于c++高阶指针与引用的应用实例,是一个非常不错的C++学习资源!
实验8 指针与引用实验报告 .doc
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],...
第六章 指针与引用6.1 示范题的求解与剖析一. 示范题一读程序写结果。程序中使用了与指针相关的常用运算:取内容运算“*”,取地址运算“&”,指针加减一个常数
C++指针与引用区别和联系的总结导图。 原文地址:http://blog.csdn.net/gaoxiang_/article/details/8459024 谢谢下载!
指针详解,关于指针的各种用法和详细知识点,配合谭浩强的C++教程
(1)使用指针和引用两种方式,完成两个学生的交换。 (2)定义一个结构体类型student,写一个函数,根据学号或者成绩,对包含有n个学生的结构体数组进行排序,学生的结构体至少包括3个成员(学号,姓名,入学分数等...
它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象,然后用智能指针去接管它,而不用担心在什么地方去delete,这个对象会最后一个接管它的智能指针释放它或者被销毁时而被delete;如果贪图方便,你...