指针和引用都是在写程序的时候经常用到的。通过指针和引用我们可以通过传形参来灵活的改变相关的参数。比如做交换时
void swapdata(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
或者通过指针
void swapdata(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
区别:
(1)引用被创建时一定要被初始化,否则就会报错。但是指针就不同了,它可以随时随地初始化(想什么时候初始化就初始化)。未被初始化的指针将指向随机的地址,这样就会造成隐患
'b' declared as reference but not initialized|
(2)引用一旦被指向一个对象,就不能再指向另一个对象了。如果改变就会编译出错
就好比小明有一天被起了个外号叫狗蛋,那么我一想起狗蛋就知道是小明。然后呢小刚有被起了个外号也叫狗蛋.那么狗蛋到底是小明呢还是小刚呢(二义性)。
int a=100;
int &b=a;
int c=200;
&b=c;
lvalue required as left operand of assignment|
但是指针就不一样了,因为指针为一个地址空间,它存储着被指向对象的地址。所以它可以随时改变被指向的对象。
(3)引用必须是一个合法的引用,也就是说null引用不存在
(4)引用不分配内存单元,而指针分配相关的内存单元(间接引用)。
(5)没有const引用,但存在const指针.因为引用一旦被初始化就无法再改变了,所以const也就没得用了
(6)sieof(引用) 返回的是被引用对象的大小,而sizeof(指针)返回的是被指向对象的地址的大小
double a=100;
double &b=a;
double *c=&a;
cout<<"a变量的大小="<<sizeof(a)<<" "<<"a变量的大小="<<sizeof(b)<<" "<<"a地址的大小="<<sizeof(c)<<endl;
这里的输出结果为:
(7) 在进行相关的参数传递时,指针是形参的拷贝,而引用为实参的传递。就是说指针作为形参的时候,接受到的是一个实参的地址。而引用作为形参的时候就是给形参另起了一个别名(直接操作实参)
(8)不存在引用的引用(难道外号还有外号吗?),但是存在指向指针的指针(因为指针存在相关的内存空间)
(9)对于自增符号来说,指针的自增为指向地址的改变,而引用的自增为被引用数的改变。