1、两者的定义和性质不同
指针是用来存储一个地址的变量,指向内存中的一个存储单元;
引用是原变量的一个别名,跟原来的变量本质上是同一个东西。
int a=10;
int*p=&a;// p是指针, &是求地址的运算
int &s=a;// s是引用, &是做标识作用
上面定义了一个整型变量 a,p 是一个指针变量,p 的值是变量 a 的地址;
而引用 s是 a 的一个别名,在内存中 s 和 a 占有同一个存储单元。
![](https://img-blog.csdnimg.cn/img_convert/a52d816483194bc498bbd2f9d9893a41.png)
2、指针可以为空,引用不可以为空
int*p=NULL;// 合法
int &S=NULL;// 不合法
3、引用必须初始化,指针不需要
int &s;// 不合法
int a=10;int &s=a;// 合法
int*p;// 合法
4、指针可以有多级指针,引用只能是一级
int**p;// 合法
int&&a;// 不合法
5、sizeof 的运算结果不同
int a=10;int*p=&a;int &s=a;
printf("%d",sizeof(p));// 返回 int* 类型的大小
printf("%d",sizeof(s));// 返回 int 类型的大小
在64位机器上,int* 类型的大小为8个字节,在32位机器上,int* 类型的大小为4个字节;
int类型的大小为4个字节。
6、指针和引用作为函数参数时,指针需要检查是否为空,引用不需要
void function_p(int*p)
{// 需要检查P是否为空
assert(p!=NULL);
//doing
}
void function_s(int&s)
{// 不需要检查s
// doing
}
PS:指针其实也不需要,在使用指针时检查是否为空是一种好的习惯。
指针和引用为函数参数时传递的是内存地址,函数对形参的操作会影响实参的值,实参的值会随着形参的改变而改变。
7、指针可以改变所指对象,引用初始化之后不能别改变
int a=10;
int*p=&a;// 初始化, p存储a的地址
int &s=a;// 初始化, s是a的引用
int b=20;
p=&b; // 合法, p更改为b的地址
&s=b; //不合法, s不可以再变
8、自增运算意义不同
p++之后指向a后面的内存,s++相当于a++。
int a=10;
int*p=&a;
int &s=a;
p++;s++;