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,*p; //定义了指向int的指针p和int i
int* p, i; //容易混淆
-
多语句:分开写
int i; int *p; int &r=i;
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用