C++指针和引用的区别

1. 指针和引用区别:

指针:

  • 指向一块内存,它的内容是所指内存的地址,使用过程中可以更改被指内存的内容;
  • 指针可以为空,可以在使用过程中指向其它地址,(不专心);

引用:

  • 某块内存的别名,在使用过程中引用不可以改变指向(虽然引用不可以改变指向,但是可以改变初始化对象的内容)
  • 定义一个引用的时候,必须初始化,要不然编译报错。

在指针和引用传递参数时,一般选则引用会比较安全一些,因为引用被初始化后就不能被更改了。当然也可以使用const指针
int *const p:指向int类型的const指针,指针不能更改,编译阶段会报错
const int*p:指向const变量的int*指针,指针的值可以更改,但是指针所指的内存是无法修改的
如下形参是const指针,其指向是无法修改的,

void print_value(int* const a){
    *a = 666;    //a是aaa的别名,相当于修改了aaa。
    //int b = 444;
    //a = &b;
}

引用例子示范:
在这里插入图片描述
从上面的运行的结果看,虽然引用是一个别名,操作别名,就相当于操作原始变量。如上面引用变量地址和原始变量一致。

2.引用占用内存吗

基于VS2010反汇编的结果来看,引用是申请内存的

0005154E  push        3  
00051550  push        2  
00051552  push        1  
00051554  lea         ecx,[t1]   #取出ti对象地址到ecx寄存器。
00051557  call        `wmain'::`2'::t_demo::t_demo (515D0h)  
    36:     t_demo &ref_t1 = t1; //这里定义引用ref_t1
0005155C  lea         eax,[t1]  #取出ti对象地址到eax寄存器。
0005155F  mov         dword ptr [ref_t1],eax  //这里将t1对象地址,保存到ref_t1指向的内存中
    37:     t_demo *t1_addr = &ref_t1;
00051562  mov         eax,dword ptr [ref_t1]  //将ref_t1指向内存的内容,保存到eax中
00051565  mov         dword ptr [t1_addr],eax  //将t1保存到t1_addr指向的内存中。
    38:     int size_ref_t1 = sizeof(ref_t1);
00051568  mov         dword ptr [size_ref_t1],0Ch  
    39:     return 0;
0005156F  xor         eax,eax  
    40: }

上面最重要的就是下面2行代码,如果ref_t1,不申请内存的话,那么第二行赋值语句肯定是要报错的。探索到这里,分析引用到底占不占用内存,也没多大意义。一般引用变量是局部变量,使用之后不久就要释放了。(网上也有人讨论引用是不占用内存)

0005155C  lea         eax,[t1]  #取出ti对象地址到eax寄存器。
0005155F  mov         dword ptr [ref_t1],eax  //这里将t1对象地址,保存到ref_t1指向的内存中

反汇编运行代码
在这里插入图片描述
上面监听能看到,引用地址和对象地址都是一样的。但用sizeof去计算引用对象大小时,和其引用对象大小是一样的。

3.C++数组引用讨论:

https://www.cnblogs.com/yqskj/articles/2207168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值