• 复合类型


    复合类型是基于其它类型定义的类型,如指针和引用。

    引用

    • 引用是为对象起了另外一个名字,引用类型引用另外一种类型。
    • 定义引用类型时必须初始化。
    • 定义引用类型时,程序把引用和它的初值绑定在一起,而不是将初始值拷贝给引用。
    • 引用一旦初始化就将和它的初值永远的绑定在一起,不能再将引用绑定到另外的对象。
    • 定义一个引用后,对于引用的任何操作实质上都是对引用绑定对象的操作。
    • 引用不是一个对象,所以不能定义引用的引用。
    • 引用只能绑定到对象上,而不能与字面值或某个表达式的计算结果绑定。
    • 引用的类型必须与它绑定的对象严格匹配。

    指针

    • 指针本身就是一个对象,所以存在指向指针的指针。
    • 在指针的声明周期里可以指向几个不同的对象。
    • 定义指针时不一定必须赋值,定义在块作用域内的指针如果没有被初始化,将拥有一个不确定的值。
    • 指针类型要和它所指向的对象严格匹配。

    指针的值

    • 指向一个对象。
    • 指向紧邻对象所占空间的下一个位置。
    • 空指针,意味着指针没有指向任何对象。
    • 无效指针,除了上述情况以外的其他值。

    试图拷贝或以其它形式访问无效的指针的值都将引发错误。

    空指针

    空指针不指向任何对象,试图使用一个指针之前代码可以先检查它是否为空。

    生成空指针的方法:

    int *p = nullptr;  //C++ 11新标准
    int *p = 0;
    int *p = NULL;	//需要包含头文件<cstdlib>
    

    指针的一般操作

    • 只要指针拥有一个合法的值,就可以将其用在条件表达式中,任何非0的指针对应的条件值都是 true
    • 对于两个类型相同的合法指针,可以用 ==!= 操作符对其进行比较。两个指针相等的情况:
      • 它们都是空指针。
      • 它们都指向同一个对象。
      • 它们都指向同一个对象的下一个地址。

    void* 指针

    void* 指针是一种特殊的指针类型,可用于存放任意对象的地址。

    不能直接操作 void* 所指向的对象,因为并不知道这个对象究竟是什么类型,也就无法确定能在这个对象上做哪些操作。

    利用 void* 指针可以做事:

    • 拿它和别的指针比较
    • 作为函数的输入或输出
    • 赋给另一个 void* 指针。

    理解复合类型的声明

    定义多个变量

    int *p1,p2; //p1是指向int的指针,p2是int
    int *p1,*p2; //p1,p2都是指向int的指针
    

    指向指针的指针

    通过*可以区别指针的级别,** 表示指向指针的指针,*** 表示指向指针的指针的指针。

    指向指针的引用

    引用本身不是对象,因此不能定义指向引用的指针。但是指针是对象,所以可以定义指针的引用。

    int i = 42;
    int *p;
    int * &rp = p; //rp是一个对指针p的引用
    
    rp = &i;	//rp是引用,因此给rp赋值&i就是让p指向i
    *rp = 0; //解引用rp得到i,也就是将i的值修改为0
    
  • 相关阅读:
    jvisualvm工具使用
    Java四种引用包括强引用,软引用,弱引用,虚引用。
    <实战> 通过分析Heap Dump 来了解 Memory Leak ,Retained Heap,Shallow Heap
    什么是GC Roots
    Memory Analyzer tool(MAT)分析内存泄漏---理解Retained Heap、Shallow Heap、GC Root
    JDK自带工具之问题排查场景示例
    websocket协议握手详解
    ssh 登陆服务器原理
    新版本macos无法安装mysql-python包
    如何将多个小值存储进一个值中
  • 原文地址:https://www.cnblogs.com/xiaojianliu/p/12498700.html
Copyright © 2020-2023  润新知