学习引用与指针区别

性质区别:
指针
1、可以未初始化,可以赋空
2、一个变量,有两个值,一个自身的值用于存放地址,一个由自身所存储值指向内存的一个存储单元
4、可以有多级指针
5、可以有const指针
6、指针的值初始化后可以改变
7、而 sizeof指针 得到的是指针本身的大小
引用
1、定义局部引用时必须初始化,引用分配内存空间时,必须进行初始化
2、无多级引用
3、一但定义初始化后不能改变
4、sizeof引用 得到的是所指向的变量(对象)的大小
7、指针和引用的自增(++)运算意义不一样
8、不能建立引用数组
9、不能作为数组元素的别名
10、不能建立引用的指针
11、可以取引用的地址
引用应用:
1、引用作为参数

void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用
{ 
    int p=p1; 
    p1=p2; 
    p2=p; 
}
main( )
{
 int a=10,b=20;
 swap(a,b); //直接以变量a和b作为实参调用swap函数
 printf("%d %d \n",a,b);
}

上述程序运行时,结果为20 10。
传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作.使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;
常引用
常引用声明方式:const 类型标识符 &引用名=目标变量名;
用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而保护了引用的目标。
引用做函数返回值
引用还可以作为返回值使用。
(未完待续!)
代码比较

void main()
{
    int a=10;
    int &b=a;//引用的使用
    int *p=&a;//指针的引用
    b=100;
    *p=200;
}
//反汇编
    int a=10;
004113DE  mov         dword ptr [a],0Ah 
    int &b=a;
004113E5  lea         eax,[a] 
004113E8  mov         dword ptr [b],eax 
    int *p=&a;
004113EB  lea         eax,[a] 
004113EE  mov         dword ptr [p],eax 
    b=100;
004113F1  mov         eax,dword ptr [b] 
004113F4  mov         dword ptr [eax],64h 
    *p=200;
004113FA  mov         eax,dword ptr [p] 
004113FD  mov         dword ptr [eax],0C8h 

对比指针对内存的访问 与 引用对内存的访问 ,反汇编中显示引用与指针是一致的
可以理解
int a=10;
int &b=a;//等价于int * const b=&a;
b=100;//等价于*b=100;
从这方面了解引用在一般的使用中与指针是有着一致性的。

引用总结
在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。

用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值