问题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章。
分享到:
相关推荐
C++指针与引用的区别 指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容...
2.1.2 引用与指针有什么区别?
### 指针和引用的区别详解 #### 一、引言 在计算机编程尤其是C++中,指针和引用是非常重要的概念。它们都是用来处理内存地址的重要工具,但两者之间存在本质的区别。本文将深入探讨指针和引用的区别,帮助读者更好...
此时,使用指针引用就显得尤为重要了。 例如,如果我们想要在函数`func1`中更新`pMyClass`所指向的对象,而不只是修改`pMyClass`本身的值,我们可以这样声明函数: ```cpp void func1(MYCLASS*& pMyClass) { ...
本篇将详细阐述指针与引用的区别和联系,帮助你深入理解这两个核心概念。 首先,我们来看指针。指针是C++中的一个变量,它存储的是内存地址,即另一个变量的位置。通过指针,我们可以间接地访问和修改该地址所对应...
在这个“智能指针与引用计数详解”的demo中,我们可以期待看到如何自定义智能指针类以及引用计数类的实现。通常,自定义的智能指针类需要包含以下关键功能: - 构造函数和析构函数,以正确初始化和清理资源。 - 赋值...
如果想要通过指针参数改变主调函数中的变量,需要使用指向指针的指针或指针引用。 引用传递参数则有所不同,虽然引用在函数内部也是一个局部变量,但它存储的是原始变量的地址。因此,对引用参数的任何操作都会直接...
同时,了解引用与指针的区别也有助于我们在编写C++代码时,更好地运用引用这一特性。在C++中,引用不仅可以用于指针,还可以用于其他变量,而且引用通常比指针更加安全,因为引用必须在声明时就被初始化,并且不能...
在C++编程语言中,高阶指针和引用是两种重要的高级特性,它们极大地扩展了对内存和对象的操纵能力。本实验通过两个实例详细介绍了这两种概念及其在实际编程中的应用。 首先,我们来看第一个实例,它涉及到了二级...
指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将真实的...
在C++编程语言中,指针和引用是两种非常关键的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于编写高效、安全的代码至关重要。 首先,指针是一个变量,它存储...
通过理解内存地址的概念,熟悉指针变量的定义和操作,以及指针与引用的区别,开发者可以编写出更高效、更灵活的代码,解决复杂的问题。在实际编程中,合理运用指针能够显著提升程序性能,但同时也需要谨慎处理,避免...
指针和引用是C++语言中的两种非常重要的概念,它们都是用来间接访问内存中的对象,但有着本质的区别。 首先,指针是一个变量,它存储的是另一个变量的地址。这意味着指针可以被重新赋值,指向不同的对象。例如,你...
1. **引用必须在定义时初始化**:与指针不同,引用不能保持未初始化状态,必须在声明时就绑定到一个对象。 2. **引用不能为NULL**:引用总是必须引用某个有效的对象,不能像指针那样设置为NULL。 3. **引用一旦初始...
### 引用与指针的区别 1. **初始化**:引用在声明时必须初始化,而指针可以在任何时候初始化。 2. **可变性**:引用初始化后不能改变其指向的对象;指针可以在程序运行期间重新指向其他对象。 3. **空值**:引用不...
在实际中,使用对象引用作函数参数要比使用对象指针作函数更普遍,这是因为使用对象引用作函数参数具有用对象指针作函数参数的优点,而用对象引用作函数参数将更简单,更直接。所以,在C++编程中,人们喜欢用对象...
总结:在实际使用中,值传递一方面会占用内存空间,内置类型还好(int等),如果是类(class)类型,赋值可能会是很大一笔...而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给代码增加复杂性,难维护性
指针和引用在使用上有一些关键区别: 1. 存储:指针本身占用内存,而引用不占内存,只是已有变量的一个别名。 2. 可为空:指针可以为空(NULL),引用必须始终引用某个有效的对象。 3. 操作:指针可以被赋值新的地址...
总的来说,指针和引用各有优势,指针提供了灵活性和复杂性,而引用则提供了安全性和简洁性。开发者应根据具体需求和场景选择合适的数据结构。在处理内存管理和需要动态改变对象的指向时,指针是必要的;而在需要确保...