指针与引用
指针以及引用有很多相似的地方,使用他们作为形参,都可以修改主调函数变量从而达到值的双向传递。都可以避免复制值的发生从而减少调用数据的开销。
引用
之前在介绍引用时将其介绍为其他变量的别名,但是对一个确定的引用来说,他可能在不同时刻表示不同变量的别名,因此,要在内存中为引用分贝空间来标识它所引用的变量,在程序运行时,变量只能依靠地址来区别,因此,只有通过储存被引用变量的地址,在运行时才能准确定位被引用的变量。在运行时引用所占的内存空间中。引用本身所占的内存空间中,储存的就是被引用变量的地址,这与指针有着相似的性质。
指针
指针是C语言本身就有的一个特性,C++在继承了C语言指针的同时,同时引进了引用。指针储存的是地址,这一点毋庸置疑,而引用是一种较高层的概念——变量的别名,把地址这一概念隐藏起来了。但是在实际运行过程中还是不得不借助地址,所以二者在本质上是相同的。
指针与引用的区别
指针与引用的最大区别在于,指针可以多次更改被指向的对象,但是引用在初始化后就不能在更改,因此,可以将引用看成一个常量指针。
int x=1;
int *p1=&x;//初始化指针指向的变量
int &p2=x;//x的别名p2
从以上的叙述中我们可以知道,引用能够实现的功能指针全部能够实现,引用只不过就是一个常量指针而已。那么为什么还要引入”引用“这一概念呢?
这是因为指针虽然功能强大,使用灵活,但是当希望函数的形参是指针时,主调函数会使用 “&”,而被调函数则为“*”,程序会显得很繁琐,而且在这类用途之下,指针的算数运算尽管不需要使用,但是如果被不慎误用,则会造成不必要的麻烦,如果要避免这一情况,可能要将指针设定为常量,但是这样参数会显得很麻烦。
具体参考如下
#include<iostream>
#include<string>
using namespace std;
void swap(int * const p1,int * const p2)
{
int p3 ;
p3 = *p1;
*p1 = *p2;
*p2 = p3;
}
void swap1(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
int main()
{
int a1 = 1;
int a2 = 2;
swap(&a1,&a2);
cout << a1 << "\n" << a2 << endl;
swap1(a1, a2);
cout << a1 << "\n" << a2 << endl;
}
我们可以看到,使用引用在调用形参时更加简洁。