在区别分析指针(ElementType *e)和指针引用(ElementType *&e)之前先来明确一下概念:
指针:
指针利用地址,它直接指向存在电脑存储器中某一地址。由于通过地址能找到所需的变量单元,可以说,地址指向变量单元。因此,将这一指向形象化的称为“指针”。意思是通过它能找到它指向的地址的内存单元。
ElementType *p;
//声明了一个ElementType(变量类型:int、struct等等)型的指针,它能够指向一个
ElementType型变量,这里没有进行初始化,所以它的指向为空。
引用:
引用就是某一变量的一个别名,(&也有理解为取地址,不过引用我觉得更贴切)对引用的操作与对变量直接操作完全一样。
引用的声明方法:类型标识符 &引用名=目标变量名;。
ElementType &e = t;//声明了一个对变量t的引用,对e的操作就是对t的操作。
例:
int main(){
int t = 2;
int &e = t;
e++;
cout<<t<<endl;//t的输出是3,e++就相当于t++;
}
指针、指针引用、引用的分析:
举个栗子:
#include<iostream>
using namespace std;
int *p = 0;
void fun1(int *p){//对指针p指向的地址的内存单元进行操作,
*p = 1;
}
void fun2(int *&p){//似乎和指针一样,都是对p指向的地址的内存单元进行操作
*p = 2;
}
void fun3(int p){//传过来的是p的值,而不是p本身,
//这里的p是局部变量不会影响到主函数中p的值
p = 3;
}
void fun4(int &p2){//传过来的是地址(&为取地址运算符),也可以理解为p的引用
//为方便区分这里将p的别名改为p2,或者说p2是主函数中p的引用,对p2的操作就是对p的操作
p2 = 4;
}
int main(){
int tmp = 0;
p = &tmp;
cout<<"*p = "<<*p<<",tmp = "<<tmp<<endl;//*p = 0,tmp = 0
tmp = 0,p = &tmp;//指针p指向的是tmp的地址,也就是 *p == tmp(*取内容)
fun1(p);
cout<<"*p = "<<*p<<",tmp = "<<tmp<<endl;//*p = 1,tmp = 1
tmp = 0,p = &tmp;
fun2(p);
cout<<"*p = "<<*p<<",tmp = "<<tmp<<endl;//*p = 2,tmp = 2
tmp = 0,p = &tmp;
fun3(*p);
cout<<"*p = "<<*p<<",tmp = "<<tmp<<endl;//*p = 0,tmp = 0
tmp = 0,p = &tmp;
fun4(*p);
cout<<"*p = "<<*p<<",tmp = "<<tmp<<endl;//*p = 4,tmp = 4
}