取消对null指针的引用_1.3 引用与指针

取消对null指针的引用_1.3 引用与指针_第1张图片

导图

取消对null指针的引用_1.3 引用与指针_第2张图片

引用

  • what is 引用?
    翔曰:“引用者,绰号也。” 哈哈哈,话粗理不粗,人(变量)只有一个,但是绰号可以很多。官方解释引用是变量的别名,不是实体类型【注释1】。它长这样子:
    int a = 94;
    int &b = a;//引用必须初始化
  • 引用从何而来?
    众所周知,c++从某一方面来说是c的威力加强版,因此在设计之初,c++委员会既想保留c指针的高效性,又想避开对指针操作不慎带来的bug,于是引入了引用 这一概念想要取代指针操作,却发现指针太牛掰了,根本取代不了,引用也有了其他的用途(伟大的发现总是不经意间诞生的是吧,比如“某哥”)。
  • 引用在哪使用?
    • 从函数中返回引用时,一定要保证在函数返回以后,被引用的目标一直有效,也就是不能返回局部变量的引用,因为一旦函数返回,局部变量都会被析构。
      int& func(int a);
    • 使用引用作为形参,那么形参和实参就是同一个对象,也就不存在对象的复制,避免了复制的开销(划重点!);
    • 修改形参也就相当于修改实参。
    • 实际利用的比较多的是优势是避免开销。
      int func(int &a);
  1. 引用型形参 :
  2. 引用型 返回值 :
  • 注意
  • 引用必须初始化(作为形参时,但传入实参时初始化);
  • 引用不能更换目标,比如:
    int a = 94;
    int c = 95;
    int &b = a;
    b = c;//错误,引用不能更改目标

指针

  • what is 指针?
    翔曰:“指针者,一曰实体,二曰数据类型。” 指针作为实体时,是用来保存一个内存地址的变量 ;作为数据类型时,指针类型描述了一种对象,其值为对被引用类型实体的引用。没错,这是百度百科上说的官解,看完我也一脸懵逼,怎么理解呢?其实就是:
    int a = 94;
    int* pa = &a;//"&"在这里是取地址符,不是引用
    对于上述代码,pa就是实体,int*就是数据类型。对于一个指针实体而言,我们主要考察“指针类型(也就是数据类型)”、“指针所指向的类型”、“指针的值”、“指针本身所占的内存区大小”。
  • 指针的值
    指针的值是指指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值,比如:
    int* pa = (int*)1;
    这里pa的值就是1(一般写作0x1,因为是地址),当编译器解析pa时,不会直接取出1就直接用,而是拿着它去找索引为1的那一块内存【注释2】,取出这块内存中的值来使用。
  • 指针所指向的类型
    例如:
    int a = 94;
    int* pa = &a;
    这里pa指向的类型就是int。(也就是说,从右往左,指针所指的类型就是消去一个"*"后所剩的部分。
  • 指针本身所占据的内存区大小
    在任何机器上(64bit or 32bit)使用sizeof()即可查看指针的大小:
    int a = 94;
    double b = 94.0;
    complex c;
    int* pa = &a;
    double* pb = &b;
    complex* pc = &c;
    //下述输出均在32bit机器上
    cout << sizeof(pa) << endl;//输出 4
    cout << sizeof(pb) << endl;//输出 4
    cout << sizeof(pc) << endl;//输出 4
    由上可知,不论指针指向的类型是啥,指针本身的大小都是4字节。也就是说指针的大小与指向的类型无关。那为什么会是4字节呢?思考一下【注释3】。
  • 其他
    理解了指针上面这四个地方,其他的都是弟弟哈哈哈哈、

指针与引用的区别

  • 存在空指针,不存在空引用;
    void* p = NULL;//空指针,合法
    void& r = NULL;//空引用,不合法
  • 指针可以不初始化(有的编译器会警告),引用不可以不初始化;
  • 存在指针数组,但不存在引用数组。
    int* parr[3] = {&x, &y, &z};//指针数组,合法
    int& rarr[3] = {x, y, z};//引用数组,不合法

总结

  • 在c++底层中,引用是通过指针实现的,也就是说,在实现层面,引用就是指针,但在语言层面,引用不是实体类型;
  • 我们通常所说的指针是实体;
  • 指针就类似于你对象的门牌号,知道了门牌号才能去提亲是吧~;
  • 微信后台发送131获取注释内容;
  • 最后喜欢我的文章请点赞关注加收藏,谢谢~。

取消对null指针的引用_1.3 引用与指针_第3张图片

你可能感兴趣的:(取消对null指针的引用,指针和引用的区别,栈顶指针到底指向哪)