1、指针和引用的区别
(1)指针是一个实体,他在栈中有自己使用的空间,但是引用没有,引用仅是个别名;
(2)引用必须初始化,指针不用,但是最好初始化;
(3)引用只能在定义时被初始化一次,之后不可变;指针可变;
(4)引用没有const,指针有const,const的指针不可变;
(5)指针和地址运用自增(++)不同,引用是值进行自增,而指针是地址进行自增;
(6)“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
(7)引用是类型安全的,而指针不是 (引用比指针多了类型检查)
(8)它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元,不能建立数组的引用
2、引用意义用法(指针就不赘述了)
int a = 2;
int &b = a;(这就是C语言规定“引用”的方式,变量b引用了变量a)
结果如下:
(1)引用变量b的值 = 变量a的值 = 2;
(2)引用变量b没有分配内存空间;
(3)引用变量b地址&b = 变量a的地址&a;
(4)int &b,本身不是一种数据类型,0字节,它只是一个别名
(5)int b是定义的一种数据类型,有内存空间4字节
3、引用作形参
int &b = a;
void func(int &b)
(1)使用时和指针一样,func(b); b被定义成引用变量b,形参要求一个引用变量,所有填入b即可
4、实际应用(这篇博客非常经典,是我在学习创建二叉树时查到,因为里面出现了int*& variable,开始不是很理解)
https://blog.csdn.net/luoweifu/article/details/39119487
但是c语言并不支持引用,比如int &a = b;但是不能识别&。看了这篇博客后,更深刻的理解了函数传参时传入的一个指针,这个指针必须要在功能函数体外部初始化过,并指向了一个实体,这样在函数内部进行赋值,值才能带出来,如果传入一个指向空或者没有初始化的指针,并在函数体内部定义变量,对变量进行赋值,再将该变量地址传给该指针,但是指针指向的的局部变量出函数体后会释放,有一个种解决方法,就是通过函数返回值返回,这样就是将局部变量通过函数返回出来,在赋值给我们外部定义的变量,这样就增加了一次赋值,使代码效率变低,在C++中,有引用变量一说,引用是必须初始化的,传参传入引用变量就避免了这个问题,防止最后我们得到的指针指向的值出现不可识别的值,因为我们写代码时会忘记给一个指针初始化,最后结果不对,不知道哪里出现了问题。
5、C++中的引用
void main()
{
int a = 10; //变量引用,b只是a的一个别名,操作b等于操作a;
int &b = a;
int *p = &a;
int *&q = p; //对指针的引用,操作q等于操作p,指针q,p本身具有相同地址空间,空间里的值存放着所指向变量的地址
int ar[10] = {0,1,2,3,4,5,6,7,8,9};
int (&br)[10] = ar; //对数组的引用,br引用一个具有10个元素的数组类型
const int x = 100;
const int &y = x; //如果x为const,其引用也必须是const,因为x已经不可改变,其引用不加const表示可以通过引用变量y改变x的值
int n = 20;
const int &m = n; //n可以改变,其引用m可以定义const,只要不通过m去改变n的值即可
const double d = 12.34;
const int &f = d; //首先编译器会分配一个临时空间,将double d的整数部分取出,放在临时空间,引用变量f指向该临时空间,而不是d空间
}