int a = 10;
int *p = &a;//指针
int& b = a; //引用
可以从上面简短的代码中看到,在指针和引用中都有&操作符,两个的区别是:当&前面有类型时(例如int),这种情况属于引用。
接下来,可以看一下对应的汇编代码:
从汇编上来看,指针与引用是相同的,没有区别。因此,引用在汇编上就是指针。它们都是地址的概念,都是在内存中用一块内存来存储所指向的地址。
但是它们还是有一些区别的:
(1)指针可以有多级指针,而引用只能有一级引用;
(2)指针可以改变指向,但是引用只能在定义时被初始化一次,之后不能再变,即“引用从一而终”;
(3)引用不能为空,必须设置初始值,而指针可以为空;
(4)引用在使用时无需解引用(*),而指针需要解引用,因此引用使用相对方便;
代码:int array[] = { 12, 4, 5, 6, 7 };
int *p1 = array;
int (*p2)[5] = &array;
int (&p3)[5] = array;
cout<<sizeof(p1)<<endl;
cout<<sizeof(p2)<<endl;
cout<<sizeof(p3)<<endl;
(5)从上面的代码可以看到,引用与指针的又一区别:
sizeof指针:得到的是指针本身(所指向的变量或对象的地址)的大小;
sizeof引用:得到的是所指向的变量(或对象)的大小;
因为,在访问引用变量(或对象)的时候,它会自动进行解引用,实际上是访问变量(或对象);
(6)可以直接获取指针的地址,但不能直接获取到引用所对应内存的地址;????????????