指针知识点总结_c++primer
指针
与引用类似,指针也是实现了对其他对象的间接访问
指针本身就是一个对象,占据内存空间,允许对指针进行赋值和拷贝,指针的生命周期可以先后指向几个不同的对象。
指针无须在定义时赋初值,与其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
空指针
生成空指针的方法:
int *p1 = nullptr;
int *p2 = 0;
// 需要包含#include <cstdlib>
int *p3 = NULL;
过去的程序使用NULL的预处理变量来给指针赋值,使用NULL和用0初始化指针是一样的。C++11新引入的方法nullptr,是一种特殊的字面值,可以转化为任意其他类型的指针类型。在新标准下,最好使用nullptr,同时避免使用NULL。
void* 指针
void* 指针是一种特殊类型的指针,可用于存放任意对象的地址。一个void*指针存放着一个地址,只是对该地址中存放的什么类型的对象并不清楚。
void*指针能做的事非常有限,拿他和别的指针比较、作为函数的输入输出、赋值给另外一个void*指针。
不能直接操作void*指针所指的对象,因为不知道对象的类型,也就无法确定能做什么操作。
void*的视角来看,内存空间仅仅是内存空间,没办法访问空间中所存的对象。
指针和引用的主要区别
指针“指向”内存中的某个对象,而引用“绑定到”内存中某个对象,它们都实现了对其他对象的间接访问,二者的区别主要有两方面:
- 指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内可以指向几个不同的对象;引用不是一个对象,无法令引用重新绑定到另外一个对象。
- 指针无须在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值;引用则必须在定义时赋初值。
给定指针p,你能知道它是否指向了一个合法的对象?如果能,叙述判断的思路;如果不能,说明原因。
在C++程序中,应该尽量初始化所有指针,并且尽可能等定义了对象之后在定义指向它的指针。如果实在不清楚指针应该指向何处,就把它初始化为nullptr或者0,这样程序就能检测并知道它有没有指向一个具体的对象了。在此前提下,判断p是否指向合法对象,只需把p作为if语句的条件即可,如果p的值是nullptr,则条件为假;反之,条件为真。
如果不注意初始化所有指针而贸然判断指针的值,则有可能引发不可预知的结果。一种处理是把if(p)置于try结构中,当程序块顺利执行,表示p指向了合法的对象;当程序块出错跳转到catch语句中,表示p没有指向合法的对象。
定义多个变量
一条定义语句可以定义出不同类型的变量:
int i = 1024, *p = &i, &r = i;
指向指针的引用
引用本身不是类,所以不能定义指向引用的指针。指针是对象,可以定义指向指针的引用。
int i = 42, *p = &i, *&r = p;
int i = 42;
int *p;
int *&r = p;
r = &i;
*r = 0;
要理解r的类型是什么,可以从右向左阅读r的定义。离变量名最近的符号对变量的类型有最直接的影响(r最近的符号是&),因此r是一个引用。声明符的其余部分用以确定r引用的类型,此例中的符号*表示r引用的是一个指针,最后的int表示r引用的是一个int指针。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧