C++ 引用的神奇之处

1. 代码
#include <iostream>

class Vptr {
public:
    int a;
};

void funciton(int &a, Vptr *p) {
   if(p == nullptr) {
       std::cout << "p is nullptr" << std::endl;
   } else {
       std::cout << a << std::endl;
   }
}

int main() {
    Vptr *p = nullptr;
    funciton(p->a, p); 
}
2. 问题分析
  • 按照我之前的理解在function调用的这一行会报错,毕竟p是一个空指针怎么能够访问成员a呢?但是神奇的是这里居然没有报错(非常的好奇)...

  • 经过AI的解释终于弄明白原因了,这个是解引用的时机的问题(学到了,学到了)...

  •  在调用function(p->a, p),由于p是一个nullptr,编译器在编译时将a 绑定到p->a这个地址,但是没有访问这个地址(解引用)

  • 在函数体内部由于p 被提前检测为空没有使用到a,所以a不会被解引用,所以不会报错。如果不做条件判断,直接使用a,则必定会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值