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*指针赋值

易混淆的符号

  • &

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

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

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

对比与总结

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;
  • 关系图

多变量定义

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

  • 风格

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

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

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

    • 多语句:分开写

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

2-3 C++复合类型的更多相关文章

  1. 第54讲:Scala中复合类型实战详解

    今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...

  2. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  3. go语言 类型:基础类型和复合类型

    Go 语言中包括以下内置基础类型:布尔型:bool整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint浮点型:floa ...

  4. C语言中的复合类型

    复合类型 一.掌握的类型 1. 指针数组 int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组 int a,b,c,d; arr[0] = & ...

  5. 学习C++.Primer.Plus 4 复合类型

    本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...

  6. C++Primer快速浏览笔记-复合类型

    C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象 ...

  7. Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  8. struts复合类型传值(对象传值)

    01:导包,配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version ...

  9. c++学习总结--复合类型,const。

    复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...

  10. postgresql 函数 参数为复合类型

    postgresql没有存储过程,但是函数功能很强大. 在近期开发的电商管理平台中,对于产品的类目管理,设计时有个属性字段,设为字符数组,但是EF不支持数组的操作,所以在添加和修改类目时,需要对属性的 ...

随机推荐

  1. redis集群主从之读写分离

    redis集群主从之读写分离 1.集群部署 这里就不详细赘述如何部署主从集群了,一般都是使用slaveOf配置来进行初始化配置. 2.与springboot集成实现读写分离 通过注解实现调用层读写分离 ...

  2. JavaScript程序设计模式小技巧——策略模式,快看快用!!!

    ## 前言> 系列首发于公众号[『非同质前端札记』](https://mp.weixin.qq.com/s?__biz=MzkyOTI2MzE0MQ==&mid=2247485576&a ...

  3. C#实现国产Linux视频录制生成mp4(附源码,银河麒麟、统信UOS)

    随着信创国产化浪潮的来临,在国产操作系统上的应用开发的需求越来越多,最近有个客户需要在银河麒麟或统信UOS上实现录制摄像头视频和麦克风声音,将它们录制成一个mp4文件.那么这样的功能要如何实现了? 一 ...

  4. kafka 运维

    查看kafka topic列表 #集群需要先执行unset JMX_PORT ./kafka-topics.sh --zookeeper gitee-zookeeper:2181 --list 查看t ...

  5. Windows中Powershell中的 rm -rf 等效命令

    Remove-Item  -Recurse  -Force  <要删除的目录> 可以简写为: rm -r -fo  <要删除目录>

  6. Ubuntu 安装 Docker Desktop

    介绍 Docker 有两种版本:Docker Desktop 和 Docker Engine (也称作 Docker CE).Docker Desktop 是带图形界面的版本,非常适合需要在桌面环境中 ...

  7. pikachu靶场 越权(水平越权+垂直越权)

    水平越权 A用户和B用户属于同一级别用户,但各自不能操作对方个人信息.A用户如果越权操作B用户个人信息的情况称为水行越权操作 三个用户 lucy/lili/kobe  密码都为123456 随便登录其 ...

  8. python pyqt6 QComboBox 圆角边框

    圆角边框周围显示黑色直角 QComboBox  新增 如下设定即可 xxx_source.view().window().setWindowFlag(Qt.WindowType.NoDropShado ...

  9. SSH 安全机制 及常见问题

    常见问题: ssh_dispatch_run_fatal: Connection to {your_ip} port 22: invalid argument ssh -oKexAlgorithms= ...

  10. 开源文档管理系统 MinDoc 安装和使用教程

    说到文档管理,很多团队的文档管理都是一团糟,每个员工在自己本地写了各种 Word 文档.Excel 表格.甚至还有手写的便签,到处都是,找起来就像大海捞针.有些聪明的团队开始用飞书来管理团队文档,但是 ...