2-3 C++复合类型

2.3.1 引用(References)

此处讨论的引用为左值引用(lvalue reference)

  • 引用就是对象的别名【引用本身不是对象,不分配内存空间】

  • 对引用的操作会作用在它绑定的对象上

  • 引用不能重新绑定对象,所有在定义引用时必须初始化

  • #include<iostream>
    using namespace std;
    int main(){
        int iVal = 100;
        //定义了一个引用,必须初始化
        int &reVal = iVal;
        //对引用的操作会作用在它绑定的对象上
        reVal++;
        //输出 101
        cout<<iVal<<endl;
        return 0;
    }
    
  • 引用必须绑定到对应类型的变量上

    • 必须是“变量”:int &i = 12; //false
    • 必须是“对应类型的”:string s; int &i = s; //false

2.3.2 指针(Pointers)

关于指针

  • 指针本身是一个对象,它的值是的它所指向的对象的地址

  • 指针支持赋值操作;*p*表示指针所指的对象

  • 指针可以重新绑定对象,定义和初始化可以分离

  • #include<iostream>
    using namespace std;
    int main(){
        int i = 1;
        int *p = &i;
        //一下两行都输出i的地址
        cout<<&i<<endl;
        cout<<p<<endl;
        //输出p所指的对象(即i)的值 1
        cout<<*p<<endl;
        return 0;
    }
    
  • 指针必须指向与之类型匹配的对象

指针操作

  • 赋值:p1 = p2。则p1,p2指向同一个对象
  • 相等:p1==p2。比较的是p1和p2的,而不是指向的对象
    • 指向的对象相同,则p1==p2
    • p1==p2,指向的对象未必相同(见后文“指针的值”)
  • 指针置于条件表达式if(p)
    • p1是空指针,等价于flase
    • 否则,等价于true

其它事项

空指针的三种表示

  1. int *p = nullptr;【最常用】:c++新标准中用nullptr表示空指针

  2. int *p = 0;

  3. int *p = NULL;

    • 需要#include<cstdio>

    • NULL被预编译为0,等价于第二种方式

void* 指针

  • void *p可以接收任意类型的变量的地址
  • 但是也正是因此,无法访问地址所指向的对象【类型未知
  • 作用【了解即可】
    • 和其它指针进行比较
    • 用作函数返回值
    • 用来给另一个void*指针赋值

易混淆的符号

image-20220109154426417

  • &
    • 定义引用时在左边,后跟变量,表示引用
    • 在右边,后跟变量,表示取址
  • *
    • 定义指针时在左边,表示指针类型
    • 其他情况下后跟指针变量,表示解引用

指针的值(地址)的四种状态

  • 指向一个对象
  • 指向紧邻对象所占空间的下一个位置
  • 空指针:没有指向任何对象
  • 无效指针:上述情况之外的其他值

对比与总结

Compound Type 对象 能否重绑定 强制初始化
引用 否【不分配内存】
指针 是【分配内存】

  1. 引用和指针同时绑定一个对象

    int i;
    int &val1 = i;
    int *p = &val1; //合法。引用就是别名,该语句等价于 int *p = &i
    int &val2 = *p; //合法。val为i的引用,该语句等价于 int &val2 = i;
    
  2. 嵌套情况

    嵌套情况 合法与否
    指针的指针int **p 合法
    指针的引用int *p; int *&r = p; 合法
    引用指针 不合法
  3. 关于指针的引用

    #include<iostream>
    using namespace std;
    int main(){
        int i = 1;
        int *p;
        //指针的引用(只有这一种写法)
        int *&r = p;
        //用引用r给指针p赋值
        r = &i;
        //用引用r修改指针p指向的对象i的值
        *r=0;
        //输出为0
        cout<<*r<<endl;
        return 0;
    }
    

2.3.3 深入理解变量的定义

变量的定义(definition)的构成

  • 基本类型 + 声明符【(类型修饰符+)变量名】

    • 基本类型+变量名 : int i;
    • 基本类型+类型修饰符+变量名:int *p;int &r=i;
  • 关系图

    image-20220109224758454

多变量定义

  • 不同变量的声明符会分别作用于基本类型,所以一条定义语句中可以定义多种类型的变量

  • 风格

    • 单语句:不要把类型修饰符和基本类型写在一起

      int i,*p; //定义了指向int的指针p和int i

      int* p, i; //容易混淆

    • 多语句:分开写

      int i;
      int *p;
      int &r=i;
      

原文链接: https://www.cnblogs.com/timothy020/p/15790190.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    2-3 C++复合类型

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/184734

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午10:47
下一篇 2023年2月12日 上午10:47

相关推荐