首页 > 指针和引用的区别

指针和引用的区别

对一个变量,它的指针和引用有什么区别


谷歌了一下汇总如下

  1. C++ 指针 和 引用

    指针不必初始化
    引用必须初始化

       int i = 2;
       int *pi;
       Int &ri = i
       

    指针赋值后可以更改
    引用初始化后不能更改

       pi = &i;
       pi = 0;
    

    虽然大多数 C++编译器 以指针方式实现引用,
    即引用获得的空间和指针一样大,内部存了被引目标的地址
    但是无法获得引用自己的地址, 试图获取引用的地址将得到被引目标的地址

       pi = &ri;
    

    可以对指针进行指针算数,前进/后退 指针
    可以对引用取得的地址进行指针算数 例如 ( ( &ri ) + 5 )

    指针可能指向不合法的地址,该目标地址可能已经被别的内容占用了。
    引用也可能指向已经被释放的目标。
    不经过检查,直接使用都可能段错误

  2. Java 只有引用 而且是类型安全的

    JVM 的垃圾回收器 只会回收 无引用指向的对象,
    所以引用不会指向一个已经被回收的对象

  3. 使用场合

    通常引用作为语法糖用于形参和返回值,
    从而简化方法的读写,
    也加快方法调用直接使用实参,避免复制实参到形参的过程。

    而且,当重载运算符的时候,编译器不接受指针参数,可以用引用作为形参

    在实现数据结构和算法时用参数方便进行指针算数

  4. 参考来源

[http://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a-reference-variable-in]

[https://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf]


指针是变量,引用是常量


指针和引用对变量来说,都可以通过它们来间接访问变量。
指针: 是一个对象,可以有自己的存储空间。
对一个变量来说,指向这个变量的指针就是用一个对象(对象:可以认为是具名有类型的内存区域)来存储这个变量的地址的一种数据类型,而要真正使用这个变量内的值时,还必须去通过对象来使用他,c/c++中用*p来表明你要使用的是这个变量的值,而不是变量的地址。
引用:是一个标识符,只有名字,而没有自己的存储空间。
对一个变量来说,这个变量的引用就是这个变量的别名。要使用这个变量的值,可以直接用这个引用来使用这个变量的值。

一般情况下, 在c++中

             如果我们对变量的地址(也就是存储变量内容的空间)感兴趣,多是使用指针,
             如果我们对变量的值(也就是存储在内存空间的内容)感兴趣,多是使用引用。
             

引用相对指针来说,对变量的值的操作更加方便,而且不容易出错。
指针相对引用来说,对变量的地址操作更加方便,虽然也可以通过变量的引用来得到变量的地址,但是使用指针更加方便。

但是对引用来说,因为他只是一个名字,所以要想他有意义,必须与一个对象绑定,如果只是声明一个引用类型的名字,编译器会报错。
int *p ;√
int &p ; ×

引用可以干的事,指针都可以干,但是指针干的事,引用不一定能干。引用本身有点类似指针的语法糖,没有具体的提升效率,只是使用更加方便。

对引用的使用也有限制,当对象可能是个空值,是禁止使用引用的,只能使用指针来简洁访问变量。具体为甚么,我不清楚,但我猜是空值的特殊性,因为空值本身是可以代表任何类型的。而
引用的类型事实上就是变量的类型。


有一个经典的比喻就是变量就像是住房,变量名像是门牌,指针像是通讯地址(就是具体的住址),你可以通过门牌名和一个对应的地址簿找到某个住房的住客,也可以直接通过通讯地址找到住房的住客,也可以给他的房子再加一个门牌,让你更容易找到某个房子的住客。

另外,许多实现中引用是指针包装而成的


“指针”:一个变量的地址
int a;
int* pa=&a;pa里存的就是变量a的地址;
“引用”:一个变量的别名
int a;
int& na =a;
na 和a 都是同一个变量
“引用”可以用在形参当中,如果形参是一个变量的话,函数会复制一份这个变量,这会消耗一定的时间和内存。
引用,直接使用实参,就可以避免这个问题。


指针:保存的变量地址,即指向某个变量。如:

int a=11;
int *pa=a;

如图:

引用:
明白引用,先要明白:变量名不是给程序本身看的,是给程序员看的。
程序在运行的时候,不会使用变量名,而是直接使用变量的地址。

int a=11;//我们可以看为是 a 这个名字,映射到存储11这个变量的地址上。
int &b=a;//我们可以看为是 b 这个名字,也映射到a映射的变量地址上。也即变量的别名。

形象的例子:
就如某人大名叫 张三,小名叫 福来 一样。
张三和福来都是同一个人。


字面意思,指针是一个指针型变量,指向了一个地址。引用则是这个变量本身。

【热门文章】
【热门文章】