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
其它事项
空指针的三种表示
int *p = nullptr;【最常用】:c++新标准中用nullptr表示空指针int *p = 0;int *p = NULL;需要
#include<cstdio>NULL被预编译为0,等价于第二种方式
void* 指针
void *p可以接收任意类型的变量的地址- 但是也正是因此,无法访问地址所指向的对象【类型未知】
- 作用【了解即可】
- 和其它指针进行比较
- 用作函数返回值
- 用来给另一个void*指针赋值
易混淆的符号

&- 定义引用时在左边,后跟变量,表示引用
- 在右边,后跟变量,表示取址
*- 定义指针时在左边,表示指针类型
- 其他情况下后跟指针变量,表示解引用
指针的值(地址)的四种状态
- 指向一个对象
- 指向紧邻对象所占空间的下一个位置
- 空指针:没有指向任何对象
- 无效指针:上述情况之外的其他值
对比与总结
| Compound Type | 对象 | 能否重绑定 | 强制初始化 |
|---|---|---|---|
| 引用 | 否【不分配内存】 | 否 | 是 |
| 指针 | 是【分配内存】 | 是 | 否 |
引用和指针同时绑定一个对象
int i;
int &val1 = i;
int *p = &val1; //合法。引用就是别名,该语句等价于 int *p = &i
int &val2 = *p; //合法。val为i的引用,该语句等价于 int &val2 = i;
嵌套情况
嵌套情况 合法与否 指针的指针 int **p合法 指针的引用 int *p; int *&r = p;合法 引用指针 不合法 关于指针的引用
#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 iint* p, i; //容易混淆多语句:分开写
int i;
int *p;
int &r=i;
2-3 C++复合类型的更多相关文章
- 第54讲:Scala中复合类型实战详解
今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...
- go语言 类型:基础类型和复合类型
Go 语言中包括以下内置基础类型:布尔型:bool整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint浮点型:floa ...
- C语言中的复合类型
复合类型 一.掌握的类型 1. 指针数组 int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组 int a,b,c,d; arr[0] = & ...
- 学习C++.Primer.Plus 4 复合类型
本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...
- C++Primer快速浏览笔记-复合类型
C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象 ...
- Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- struts复合类型传值(对象传值)
01:导包,配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version ...
- c++学习总结--复合类型,const。
复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...
- postgresql 函数 参数为复合类型
postgresql没有存储过程,但是函数功能很强大. 在近期开发的电商管理平台中,对于产品的类目管理,设计时有个属性字段,设为字符数组,但是EF不支持数组的操作,所以在添加和修改类目时,需要对属性的 ...
随机推荐
- 关于centos7下所有指令失效
起因: 疑似宝塔更新修复后,本地所有环境变量集体不生效 问题环境 xshell环境下ssh连接 问题描述: - bash: xxx not fund - 环境变量无法保存 - 所有的保存方式都是临时生 ...
- 全网最适合入门的面向对象编程教程:39 Python常用复合数据类型-集合
全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合 摘要: 在 Python 中,集合(set)是一种常用的复合数据类型.集合是一组无序且不重复的元素.与列表和元组不同,集合 ...
- Ubuntu 设置中文
首先安装中文语言包: sudo apt install -y language-pack-zh-hans 接下来在 ~/.zshrc 或 ~/.bashrc 中添加如下内容: export \ LAN ...
- 随机读取数组中n个元素
需求 随机不重复的显示一系列图片 分析 可使用Math.random(),其作用是返回介于 0(包含) ~ 1(不包含) 之间的一个随机数.先获取到图片路径,将图片路径放入数组中,再随机从数组中读取n ...
- 【YashanDB数据库】YAS-02143 invalid username/password, login denied
[问题分类]错误码处理 [关键字]jdbc,02143 [问题描述]应用启动后,报错YAS-02143 invalid username/password, login denied [问题原因分析] ...
- MDC – Work with Framework & Customize
前言 在 MDC – Material Design, Angular Material, MDC, MWC, Lit 的关系 中, 我有提到基于 MDC 的 Framework 生态有多糟糕. 但它 ...
- HTML – HTML Tags & Semantic HTML 语义化 HTML
前言 HTML tag 有 100 多个, 有些是功能形的, 非用不可, 有些是为了语义化对 screen reader 友好 (给眼睛有残缺的人也可以获取清晰的网站信息). 语义化是很重要的, 有些 ...
- Asp.net core 学习笔记 dotnet & azure 常用 command
更新: 2021-08-26 最近试了一下 vs 2022 结果 .net cli 也自动升级到 .net 6 preview 版本, 害我 dotnet new 的时候出来一个 .net 6 tem ...
- 从零开始搭建一个LoRaWAN基站
先说两句 SX1301/SX1302是semtech公司推出的基站端射频基带芯片,其与SX127x/SX126x的主要区别在于: 只是个基带芯片,使用时需要加射频前端(SX125x/SAW/...) ...
- maven安装本地jar命令
mvn install:install-file -Dfile=jar包的位置 -DgroupId=pom.xml的groupId -DartifactId=pom.xm的artifactId -Dv ...