c++的void*,空指针和野指针

了解常见的指针

1.野指针

野指针就是没有初始化的指针,也叫无效指针

例如:int * p ;

p是指针类型变量,但是没有初始化,也就意味着给p分配的8个字节(32位系统是4字节)里面的内容没有初始化,可能是一些奇奇怪怪的内容。这就有了不安全的因素,因为你无法保证这里的奇奇怪怪的内容组成的地址,会指向系统一些比较关键的内容。
记住野指针非常危险,要初始化指针

2.空指针

空指针是不指向任何对象的指针。

上文我们说了,定义了指针但是没有初始化是非常危险的行为。那么我想初始化指针但是不知道初始化为什么该怎么办?没有关系,我们可以将指针初始化为空指针。就是初始化为0,不指向任何对象。这样就安全了。

常见三种空指针的定义方式:

cpp 复制代码
int* pointer = nullptr; //方式一:nullptr是空指针的字面值,就是说这么写就是把pointer定义成了空指针了
int* pointer = 0;//方式二:直接定义0值,代表空指针
int* pointer = NULL;//方式三:NULL是预处理变量,鼠标移动到NULL上可以看到,#define NULL 0ll;相当于第二种方式

注意:

第一,千万不要用如下方式

cpp 复制代码
int zero = 0;
int* pointer = zero;//这种方式是错误的,不同通过一个为0的变量给指针赋值

第二:上面第二种方式直接使用0值不代表给pointer赋值系统0号地址。学过计算机组成原理的同学应该明白,计算机确实有0号地址,但是越靠前的地址往往意味着越核心和重要。空指针的应用是为了解决知道要初始化指针但是又不知道初始化什么 的情况,于是就给空指针赋值一个系统中一个绝对安全的地址。尽管这个绝对安全的地址用nullptr\0\NULL表示,但是这不意味着就是系统中的0号地址。

3.void*指针

void* 类型的指针可以用来存放任意类型对象的地址。

一般来说,指针类型必须与指向对象类型匹配。就是所谓鱼找鱼,虾找虾。

例如:int a=10;int* pa = &a; char b='a'; char* pb = &b;

但是,人们总想偷懒,设计一个万用指针,不管是什么类型的对象,都能将地址赋值给这个万用指针。

由此void*指针诞生了。

cpp 复制代码
	int i = 10;
	string s = "hello";
	
	void* p = &i;
	p = &s;
	cout << "p = " << p << endl;
	cout << "p的长度为: " << sizeof(p) << endl;
	//cout << "*p = " << *p << endl;    // 错误,不能通过void *指针访问对象

注意:

void* 指针表示只知道"保存了一个地址",至于这个地址对应的数据对象是什么类型并不清楚。所以不能通过 void* 指针访问对象。这是因为不知道地址所代表的数据的类型是什么,也就不知道数据所占几个字节,也就不知道取几个字节的内容了。

相关推荐
枫叶v.11 小时前
Agent 分层存储架构设计:从记忆方法到中间件选型
开发语言·python
sleven fung12 小时前
MinerU与BabelDOC与KTransformers与OpenAI API库
开发语言·python·ai·langchain
萤萤七悬12 小时前
【Python笔记】AI帮实现CLI工具-使用argparse.ArgumentParser接收命令参数
开发语言·笔记·python
iCxhust13 小时前
C# 命令行指令 查看二进制文件
开发语言·单片机·嵌入式硬件·c#·proteus·微机原理·8088单板机
csdn_aspnet13 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
王老师青少年编程13 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝核心思想 )
c++·dfs·csp·信奥赛·搜索剪枝·搜索优化
一拳一个呆瓜13 小时前
【STL】使用 C++ 标准库标头
c++·stl
诸葛务农13 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法
oort12313 小时前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
王老师青少年编程13 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践2)
c++·信奥赛·csp-s·提高组·搜索剪枝·生日蛋糕·最优性剪枝