`
zhaolei415
  • 浏览: 168859 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的指针与引用

c++ 
阅读更多
1、指针和引用的定义
指针---对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义:


引用---引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义:


2、指针和引用的区别
首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用。如下图中,如果定义一个引用变量,不初始化的话连编译都通不过(编译时错误):


而声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。
其次,引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。说明:虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。见下面的代码:

#include<iostream>
using namespace std;

int main(int argc,char** argv)

{
    int i=10;
    int& ref=i;
    ref++;
    cout<<"i="<<i<<endl;
    cout<<"ref="<<ref<<endl;
    int j=20;
    ref=j;
    ref++;
    cout<<"i="<<i<<endl;
    cout<<"ref="<<ref<<endl;
    cout<<"j="<<j<<endl;
    return 0;
}


对ref的++操作是直接反应到所指变量之上,对引用变量ref重新赋值"ref=j",并不会改变ref的指向,它仍然指向的是i,而不是j。理所当然,这时对ref进行++操作不会影响到j。而这些换做是指针的话,情况大不相同,请自行实验。输出结果如下:


再次,引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节。见下图所示:


从上面也可以看出:引用比指针使用起来形式上更漂亮,使用引用指向的内容时可以之间用引用变量名,而不像指针一样要使用*;定义引用的时候也不用像指针一样使用&取址。
最后,引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
总而言之,言而总之——它们的这些差别都可以归结为"指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。"
3、特别之处const
在这里我为什么要提到const关键字呢?因为const对指针和引用的限定是有差别的,下面听我一一到来。

常量指针VS常量引用
常量指针:指向常量的指针,在指针定义语句的类型前加const,表示指向的对象是常量。

定义指向常量的指针只限制指针的间接访问操作,而不能规定指针指向的值本身的操作规定性。

常量指针定义"const int* pointer=&a"告诉编译器,*pointer是常量,不能将*pointer作为左值进行操作。

常量引用:指向常量的引用,在引用定义语句的类型前加const,表示指向的对象是常量。也跟指针一样不能利用引用对指向的变量进行重新赋值操作。

指针常量VS引用常量
在指针定义语句的指针名前加const,表示指针本身是常量。在定义指针常量时必须初始化!而这是引用天生具来的属性,不用再引用指针定义语句的引用名前加const。

指针常量定义"int* const pointer=&b"告诉编译器,pointer是常量,不能作为左值进行操作,但是允许修改间接访问值,即*pointer可以修改。

常量指针常量VS常量引用常量
常量指针常量:指向常量的指针常量,可以定义一个指向常量的指针常量,它必须在定义时初始化。常量指针常量定义"const int* const pointer=&c"告诉编译器,pointer和*pointer都是常量,他们都不能作为左值进行操作。

而就不存在所谓的"常量引用常量",因为跟上面讲的一样引用变量就是引用常量。C++不区分变量的const引用和const变量的引用。程序决不能给引用本身重新赋值,使他指向另一个变量,因此引用总是const的。如果对引用应用关键字const,起作用就是使其目标称为const变量。即没有:Const double const& a=1;只有const double& a=1;

总结:有一个规则可以很好的区分const是修饰指针,还是修饰指针指向的数据——画一条垂直穿过指针声明的星号(*),如果const出现在线的左边,指针指向的数据为常量;如果const出现在右边,指针本身为常量。而引用本身与天俱来就是常量,即不可以改变指向。
4、指针和引用的实现

我们利用下面一段简单的代码来深入分析指针和引用:

#include<iostream>
using namespace std;

int main(int argc, char** argv)
{
int i=1;
int& ref=i;
int x=ref;
cout<<"x is "<<x<<endl; 
ref=2;
int* p=&i;
cout<<"ref = "<<ref<<", i = "<<i<<endl;
}


虽然指针和引用最终在编译中的实现是一样的,但是引用的形式大大方便了使用也更安全。有人说:"引用只是一个别名,不会占内存空间?"通过这个事实我们可以揭穿这个谎言!实际上引用也是占内存空间的。
分享到:
评论

相关推荐

    C++指针与引用的区别

    C++指针与引用的区别 指针和引用是C++语言中两种不同的概念,初学者容易把它们混淆一起。这两种概念都是地址的概念,但它们有很多不同的特点和应用场景。 相同点 1. 都是地址的概念;指针指向一块内存,它的内容...

    C++指针与引用

    ### C++指针与引用详解 #### 指针与引用的基本概念 在C++中,指针和引用是两种非常重要的数据类型,它们都用于间接访问其他变量或对象。然而,它们之间存在显著的区别,了解这些差异对于有效、安全地使用C++语言至...

    c++高阶指针与引用的实例(有代码)

    在C++编程语言中,高阶指针和引用是两种重要的高级特性,它们极大地扩展了对内存和对象的操纵能力。本实验通过两个实例详细介绍了这两种概念及其在实际编程中的应用。 首先,我们来看第一个实例,它涉及到了二级...

    c++指针和引用的使用浅谈

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,并通过实例来对比它们的使用方法和特性。 首先,指针是C++中的一种特殊类型,它存储的是一个...

    C++重要的谨记指针和引用的区别

    在C++编程语言中,指针和引用是两种非常关键的概念,它们都允许我们间接访问内存中的对象。然而,它们之间存在着本质的区别,理解和掌握这些差异对于编写高效、安全的代码至关重要。 首先,指针是一个变量,它存储...

    C++引用&和指针在作为形参时的区别

    在C++中,引用(reference)和指针都是用来间接访问其他对象的工具,但它们在使用和行为上有显著的差异。引用的概念是C++特有的,而指针在C和C++中都存在。理解这两种机制的区别对于编写高质量的C++代码至关重要。 ...

    C++指针 数组 内存释放.docx

    访问指针引用的内存区域 可以使用*pNumberOne访问some_number的值。这是因为星号表示解除指针的参照,应该读作“什么什么指向的内存区域”。 指针的陷阱 当函数退出时,局部变量将被删除,这意味着指针将指向原先的...

    c++程序指针的引用.zip

    在函数参数中使用指针引用,可以避免复制指针,提高效率,同时保持代码的清晰性。例如: ```cpp void swap(int * &a, int * &b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 1, y = 2; int...

    C++中指针的使用艺术

    - 引用与指针:引用是变量的别名,不同于指针,它不占用额外的内存空间。引用的初始化必须在声明时完成,并且在整个生命周期中引用必须始终指向同一个对象。 在实际编程中,指针操作可能涉及到更为复杂的概念,例如...

    c++中指针的详细介绍

    4. **数组与指针**:在C++中,数组名实际上是一个指向其首元素的指针,因此指针可以用来遍历数组。 四、动态内存管理 指针在动态内存管理中扮演关键角色。使用`new`运算符可以动态分配内存,并返回分配内存的起始...

    c++指针和引用

    在C++编程语言中,指针和引用是两种非常重要的概念,它们允许程序员对内存进行直接操作,提高代码的灵活性和效率。对于初学者来说,理解并熟练掌握这两个概念至关重要。 首先,我们来探讨指针。指针在C++中扮演着...

    C++中的指针与引用详细解读

     指针和引用形式上很好区别,但是他们似乎有相同的功能,都能够直接引用对象,对其进行直接的操作。但是什么时候使用指针?什么时候使用引用呢?这两者很容易混淆,在此我详细介绍一下指针和引用,力争将真实的...

    C++指针和引用

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都允许我们间接访问内存中的对象。本文将深入探讨这两个主题,旨在为初学者提供一个清晰的理解基础。 首先,我们来了解一下**指针**。指针是C++中的一种特殊...

    导图_指针与引用

    在C++编程语言中,指针和引用是两种非常重要的概念,它们都用于间接访问内存中的对象,但各自有着独特的特性和用途。本篇将详细阐述指针与引用的区别和联系,帮助你深入理解这两个核心概念。 首先,我们来看指针。...

    c++中指针和引用的区别

    在 C++ 编程语言中,指针和引用是两个常用的概念,但是初学者容易混淆它们二者之间的区别。在本文中,我们将从概念、函数参数传递和编译角度来阐述指针和引用的区别。 概念上,指针是一个变量,它存放的是变量的...

    c++学习笔记(c++ 线程 指针 调试 编码)

    理解指针的引用、解引用、空指针、野指针以及指针与数组的关系是学习C++不可或缺的部分。 接下来是调试技巧:在编写C++程序时,调试是解决问题的关键步骤。GDB是一个强大的命令行调试器,可以在源代码级别跟踪程序...

    善于使用指针与引用

    在C++中,我们可以用`&`运算符获取变量的地址,用`*`运算符来解引用指针,获取或设置指针所指向的变量的值。例如,`p = &i`将变量i的地址赋值给指针p,`*p = 10`则意味着将p指向的内存位置的值设为10,等价于`i = 10...

    C++指针与引用的详解

    C++中的指针和引用是两种非常重要的编程概念,它们都是用来间接访问内存中的对象,但有着本质的区别和各自的用途。 首先,指针是一个变量,它存储了一个内存地址,这个地址指向另一个对象。指针可以被赋值为NULL,...

Global site tag (gtag.js) - Google Analytics