对一个变量,它的指针和引用有什么区别
“指针”:一个变量的地址int a;int* pa=&a;pa里存的就是变量a的地址;“引用”:一个变量的别名int a;int& na =a;na 和a 都是同一个变量“引用”可以用在形参当中,如果形参是一个变量的话,函数会复制一份这个变量,这会消耗一定的时间和内存。引用,直接使用实参,就可以避免这个问题。
指针是指向变量所在的位置的地址,获取指针指向的地址存储的值就是变量
引用是变量的别名,通过引用和变量名都可以访问变量
有一个经典的比喻就是变量就像是住房,变量名像是门牌,指针像是通讯地址(就是具体的住址),你可以通过门牌名和一个对应的地址簿找到某个住房的住客,也可以直接通过通讯地址找到住房的住客,也可以给他的房子再加一个门牌,让你更容易找到某个房子的住客。
另外,许多实现中引用是指针包装而成的
指针和引用对变量来说,都可以通过它们来间接访问变量。指针: 是一个对象,可以有自己的存储空间。对一个变量来说,指向这个变量的指针就是用一个对象(对象:可以认为是具名有类型的内存区域)来存储这个变量的地址的一种数据类型,而要真正使用这个变量内的值时,还必须去通过对象来使用他,c/c++中用*p来表明你要使用的是这个变量的值,而不是变量的地址。引用:是一个标识符,只有名字,而没有自己的存储空间。对一个变量来说,这个变量的引用就是这个变量的别名。要使用这个变量的值,可以直接用这个引用来使用这个变量的值。
一般情况下, 在c++中
如果我们对变量的地址(也就是存储变量内容的空间)感兴趣,多是使用指针, 如果我们对变量的值(也就是存储在内存空间的内容)感兴趣,多是使用引用。
引用相对指针来说,对变量的值的操作更加方便,而且不容易出错。指针相对引用来说,对变量的地址操作更加方便,虽然也可以通过变量的引用来得到变量的地址,但是使用指针更加方便。
但是对引用来说,因为他只是一个名字,所以要想他有意义,必须与一个对象绑定,如果只是声明一个引用类型的名字,编译器会报错。int *p ;√int &p ; ×
引用可以干的事,指针都可以干,但是指针干的事,引用不一定能干。引用本身有点类似指针的语法糖,没有具体的提升效率,只是使用更加方便。
对引用的使用也有限制,当对象可能是个空值,是禁止使用引用的,只能使用指针来简洁访问变量。具体为甚么,我不清楚,但我猜是空值的特殊性,因为空值本身是可以代表任何类型的。而引用的类型事实上就是变量的类型。
指针:保存的变量地址,即指向某个变量。如:
int a=11; int *pa=a;
如图:
引用:明白引用,先要明白:变量名不是给程序本身看的,是给程序员看的。程序在运行的时候,不会使用变量名,而是直接使用变量的地址。
int a=11;//我们可以看为是 a 这个名字,映射到存储11这个变量的地址上。 int &b=a;//我们可以看为是 b 这个名字,也映射到a映射的变量地址上。也即变量的别名。
形象的例子:就如某人大名叫 张三,小名叫 福来 一样。张三和福来都是同一个人。
谷歌了一下汇总如下
C++ 指针 和 引用
指针不必初始化引用必须初始化
int i = 2; int *pi; Int &ri = i
指针赋值后可以更改引用初始化后不能更改
pi = &i; pi = 0;
虽然大多数 C++编译器 以指针方式实现引用,即引用获得的空间和指针一样大,内部存了被引目标的地址但是无法获得引用自己的地址, 试图获取引用的地址将得到被引目标的地址
pi = &ri;
可以对指针进行指针算数,前进/后退 指针可以对引用取得的地址进行指针算数 例如 ( ( &ri ) + 5 )
指针可能指向不合法的地址,该目标地址可能已经被别的内容占用了。引用也可能指向已经被释放的目标。不经过检查,直接使用都可能段错误
Java 只有引用 而且是类型安全的
JVM 的垃圾回收器 只会回收 无引用指向的对象,所以引用不会指向一个已经被回收的对象
使用场合
通常引用作为语法糖用于形参和返回值,从而简化方法的读写,也加快方法调用直接使用实参,避免复制实参到形参的过程。
而且,当重载运算符的时候,编译器不接受指针参数,可以用引用作为形参
在实现数据结构和算法时用参数方便进行指针算数
参考来源
[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]
字面意思,指针是一个指针型变量,指向了一个地址。引用则是这个变量本身。
指针是变量,引用是常量
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(7)
“指针”:一个变量的地址
int a;
int* pa=&a;pa里存的就是变量a的地址;
“引用”:一个变量的别名
int a;
int& na =a;
na 和a 都是同一个变量
“引用”可以用在形参当中,如果形参是一个变量的话,函数会复制一份这个变量,这会消耗一定的时间和内存。
引用,直接使用实参,就可以避免这个问题。
指针是指向变量所在的位置的地址,获取指针指向的地址存储的值就是变量
引用是变量的别名,通过引用和变量名都可以访问变量
有一个经典的比喻就是变量就像是住房,变量名像是门牌,指针像是通讯地址(就是具体的住址),你可以通过门牌名和一个对应的地址簿找到某个住房的住客,也可以直接通过通讯地址找到住房的住客,也可以给他的房子再加一个门牌,让你更容易找到某个房子的住客。
另外,许多实现中引用是指针包装而成的
指针和引用对变量来说,都可以通过它们来间接访问变量。
指针: 是一个对象,可以有自己的存储空间。
对一个变量来说,指向这个变量的指针就是用一个对象(对象:可以认为是具名有类型的内存区域)来存储这个变量的地址的一种数据类型,而要真正使用这个变量内的值时,还必须去通过对象来使用他,c/c++中用*p来表明你要使用的是这个变量的值,而不是变量的地址。
引用:是一个标识符,只有名字,而没有自己的存储空间。
对一个变量来说,这个变量的引用就是这个变量的别名。要使用这个变量的值,可以直接用这个引用来使用这个变量的值。
一般情况下, 在c++中
引用相对指针来说,对变量的值的操作更加方便,而且不容易出错。
指针相对引用来说,对变量的地址操作更加方便,虽然也可以通过变量的引用来得到变量的地址,但是使用指针更加方便。
但是对引用来说,因为他只是一个名字,所以要想他有意义,必须与一个对象绑定,如果只是声明一个引用类型的名字,编译器会报错。
int *p ;√
int &p ; ×
引用可以干的事,指针都可以干,但是指针干的事,引用不一定能干。引用本身有点类似指针的语法糖,没有具体的提升效率,只是使用更加方便。
对引用的使用也有限制,当对象可能是个空值,是禁止使用引用的,只能使用指针来简洁访问变量。具体为甚么,我不清楚,但我猜是空值的特殊性,因为空值本身是可以代表任何类型的。而
引用的类型事实上就是变量的类型。
指针:保存的变量地址,即指向某个变量。如:
如图:

引用:
明白引用,先要明白:变量名不是给程序本身看的,是给程序员看的。
程序在运行的时候,不会使用变量名,而是直接使用变量的地址。
形象的例子:
就如某人大名叫 张三,小名叫 福来 一样。
张三和福来都是同一个人。
谷歌了一下汇总如下
C++ 指针 和 引用
指针不必初始化
引用必须初始化
指针赋值后可以更改
引用初始化后不能更改
虽然大多数 C++编译器 以指针方式实现引用,
即引用获得的空间和指针一样大,内部存了被引目标的地址
但是无法获得引用自己的地址, 试图获取引用的地址将得到被引目标的地址
可以对指针进行指针算数,前进/后退 指针
可以对引用取得的地址进行指针算数 例如 ( ( &ri ) + 5 )
指针可能指向不合法的地址,该目标地址可能已经被别的内容占用了。
引用也可能指向已经被释放的目标。
不经过检查,直接使用都可能段错误
Java 只有引用 而且是类型安全的
JVM 的垃圾回收器 只会回收 无引用指向的对象,
所以引用不会指向一个已经被回收的对象
使用场合
通常引用作为语法糖用于形参和返回值,
从而简化方法的读写,
也加快方法调用直接使用实参,避免复制实参到形参的过程。
而且,当重载运算符的时候,编译器不接受指针参数,可以用引用作为形参
在实现数据结构和算法时用参数方便进行指针算数
参考来源
[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]
字面意思,指针是一个指针型变量,指向了一个地址。引用则是这个变量本身。
指针是变量,引用是常量