引用和指针的比较
1、定义上:引用定义时便要初始化,不能为空,而且不能再改变;指针可以不初始化,可以指向NULL,而且可以改变。
int a = 10;
int * p = &a;
int &r = a;
2、内存占用上:指针会分配一个4个字节的内存,而引用只是变量的别名,就是变量其本身,不占用额外内存。如果用sizeof的话,引用得出的结果是其所指向的对象大小。
3、操作上:引用没有多级,而指针有多级,如int **p;自增的运算意义不一样。
4、作为函数形参的区别:引用传递的对象本身,而指针也可以通过指向变量的地址修改变量,但会生成一个副本。
注意:指针作为形参可以修改指向对象的值,但指针自身还是不变的,也就是说是值传递,若要同时修改指针自身的值,则需要用“引用”。#include<iostream>
using namespace std;
void f(int *p);
int main(void)
{
int *p = NULL;
test(p);
return 0;
}
void f(int *p)
{
int a = 1;
p = &a;
}
变量a的地址不为NULL,但是main函数中p的值还是NULL,为什么没有改变呢?这是因为指针p传入test函数中时,编译器会生成一个指针的副本:_p,test函数中是对_p操作,所以实际上p的值是不变的,这是指针的值传递;如果p指向了一个变量,那么通过_p是可以对变量进行修改等操作的。
如果要同时改变指针该如何做呢?用“引用”。
#include<iostream>
using namespace std;
void f(int *&p);
int main(void)
{
int *p = NULL;
f(p);
return 0;
}
void f(int *&p)
{
int a = 1;
p = &a;
}
此时传递的时p自身,编译器不会再生成一个副本。此时返回main函数中p的值已经不是NULL了。