1. 引用其实就是一个别名,它用于定义一个变量共享另一个变量的内存空间,变量是内存空间的名字,如果给内存空间起另外一个名字,就能够共享这个内存。
2. 指针则是指向一个内存空间的变量,可以通过指针来查看某个内存空间的内容,而指针本身在32位机器下占据4个字节的空间
指针和引用的区别有以下几个方面
(1)指针是一个存放变量地址的变量,它可以被改变即可以指向不同的地址空间;
引用只是一个别名,它的存在是具有依附性的,引用必须一开始就初始化,并且引用的对象不能被改变只能引用某一个对象。
(2)指针作为函数参数传递的时候实际上是值传递的方式,只要不修改形参指针指向内存空间的值,任何对形参指针的修改对实参都是没有影响的;如果要在形参中改变引起实参改变可以使用指针的指针或指针引用。
引用作为函数参数传递的时候实际上对形参引用的修改就是直接修改实参对象。
(3)指针的值可以改变;引用只能在定义的时候初始化一次,之后就不能更改了。
(4)指针可以为NULL;引用不能为NULL,引用必须对应某个存储单元。
(5)对指针求sizeof结果是4;对引用求sizeof是对象的大小。
(6)如果要返回动态分配的内存必须使用指针,不能使用引用。
char *p = (char *)malloc(4*sizeof(char)) 或 char *p = new char[4]
举例:
1. int x = 5;
int y = 10;
int *a = &x //指针a指向x的地址
int &b = a //引用b是a内存空间的一个别名
a = &y //指针a可以指向y的地址
b = y //这个时候操作b相当于a的值变成了10,此时a和b的值都是10
int &c = NULL //这个是错误的,没有空引用
int *d = NULL //这个是正确的,有空指针
2. 函数是使用
void Fun(int *p){} //如果实参是指针,函数形参也是指针,这个时候实际上是值传递,只要不修改p指向内存空间的内容,其它的任何对形参的操作对实参都是没有影响的
void Fun(int **p){} //如果实参是指针,可以利用指针的指针来传递,这个时候实际上是地址传递对形参的修改就是修改实参
void Fun(const int &a){} //常量引用,保证函数体只是对引用a只读,而无法修改,提高效率