C++指针解读(9)-- void指针和NULL

news2024/11/24 11:42:52

1、void指针的概念

void * 这种指针称为“空类型指针”,它不指向任何具体类型的数据,只提供一个纯地址。void 指针必须强制类型转换成具体类型的指针才有意义。

int i = 3;
void* p = &i;

//printf(" %d\n", *p); //报错
printf(" %d\n", *(int*)p); //必须强制转换成具体的类型

void *有什么用呢?

void *也被称为万能指针,所以在只知道内存,但是不知道是什么类型的时候,就可以用void *。

比如写一个类似memset的函数:mymemset()。

void mymemset(void* data, char num, int byte_size) {
    char* p = (char*)data;
    for (int i = 0; i < byte_size; i++) {
        *p = num;
        p++;
    }
}

在这个mymemset()函数中,我们利用void指针接收不同类型的指针,利用char类型逐个字节读取内存中的每一个字节,然后依次填充指定的数字。由于char类型是一个具体类型,所以可以使用++或者--进行指针的移动。

2、void指针相关规则

(1)任何类型的指针都可以直接赋值给void指针, 且无需进行强制类型转换。

double obj = 3.14;
double *pd = &obj;
void* pv = &obj; // 正确,void* 能存放任意类型对象的地址
pv = pd;         // 正确,pv 可以存放任意类型的指针

(2)如果要把 void 类型的指针赋值给其他类型的指针,需要进行显式转换。

double obj = 3.14;
double *pd = &obj;
void *pv = &obj;
    
double *pd1 = pv;          // 错误,不可以直接赋值
double *pd2 = (double*)pv; // 必须进行显示类型转换

(3)void指针只有强制类型转换后才可以正常对其操作。

double obj = 3.14;
void *pv = &obj;
    
printf(" %d\n", *(double*)pv);

(4)当void指针作为函数的输入和输出时,表示可以接受任意类型的输入指针和输出任意类型的指针。

在函数调用过程中的使用 void 指针作为输入输出参数,可以灵活使用任意类型的指针,比如前面的mymemset()函数。

(5)void指针变量和普通指针一样可以通过 NULL 或 nullptr 来初始化,表示一个空指针。

(6)void指针可以直接和其他类型的指针进行比较指针存放的地址值是否相同。

double obj = 3.14;
double *pd = &obj;
void *pv = &obj;
    
cout << (pv == pd2) << endl;

3、NULL和null_ptr

3.1 NULL

NULL仅仅代表空值,就是指向一个不被使用的地址。

尽快初始化指针是个非常好的习惯,如果在指针声明后暂时不想使用它,最好把指针赋为NULL。

int *p = NULL;

在很多数据结构的实现中,NULL指针有特殊的特性。比如在链表中经常用NULL来表示尾部。

指针野可以用在逻辑表达式中,比如判断指针是否为NULL可以这么写:

if(p){
    //不是NULL
}else{
    //是NULL
}

3.2 null_ptr

在C++的中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题。

在C语言中,NULL通常被定义为:#define NULL ((void *)0)

而在C++语言中,NULL被定义为:#define NULL 0

可见,在C++中,NULL实际上是0。这样在C++中NULL会存在二义性问题,比如在函数重载时会把NULL认为是0。所以C++中引入了null_ptr。

3.3

野指针:没有初始化的指针。

迷途指针/悬空指针:迷途指针指一个长生命周期的指针指向了一个短生命周期的变量。比如短生命周期的变量已经消失,但指针依然指向这个不存在的变量。

int* invalidPointer() {
    int tmp = 3;

    return &tmp; //出函数后tmp对象已被释放,返回的指针成了: 迷途指针/悬空指针
}

int main()
{
    int* p = invalidPointer();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

8月19日PMP成绩,预计10月16日公布!附查询入口、流程

PMP的考试成绩一般在考后6-8周即可查询&#xff0c;8月PMP的成绩预计会在北京时间10月16日晚上公布&#xff0c;具体时间以官方公告为准。 如何查询8月考试成绩&#xff1f; 渠道一&#xff1a;收到PMI邮件提醒 当你注册PMI所使用的邮箱收到一封PMI发来的&#xff0c;标题为…

测试培训机构「某峰」测评调查报告

测试培训机构「某峰」测评调查报告 ⭐文章简介一、机构测评之受访者介绍二、老师傅-机构测评10问&#xff01;第1问 你从哪里了解到这个培训机构&#xff1f;第2问 你为什么选择这家培训机构&#xff0c;它吸引你掏毛爷爷的点有哪些&#xff1f;第3问 回顾一下&#xff0c;从咨…

linux 学习:查找命令 find | grep

作者: 苏丙榅 原文链接: https://subingwen.cn/linux/commpress/ 在使用Linux系统的时候, 我们经常会需要查找某些文件&#xff0c;但是大多数情况下我们并不能确定这些文件的具体位置&#xff0c;这样的话就非常浪费我们的时间。Linux为我们提供了很多的用于文件搜索的命令, 如…

夜神模拟器安装教程

夜神模拟器是一款很好用的安卓模拟器&#xff0c;夜神模拟器最新版兼容性更强&#xff0c;稳定性也不错&#xff0c;简单操作使用便捷&#xff0c;可以有很好的游戏体验&#xff1a;运行完美 &#xff0c;酣畅淋漓&#xff0c;喜欢的小伙伴可以在本站下载使用&#xff0c;本期小…

binutils工具下载

一、下载binutils工具binutils-2.28.tar.bz2 https://ftp.gnu.org/gnu/binutils/ 二、解压 tar -xvjf binutils-2.28.tar.bz2三、建立build目录 在binutils-2.28下创建目录build 指定编译目录&#xff1a; ../configure --enable-debug --prefix/home/zhangchuang/ld/bin…

【TES720D-KIT】青翼自研基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)

TES720D-KIT是专门针对我司TES720D&#xff08;基于复旦微FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成…

SycoTec 4061主轴维修:主轴检测与维修过程记录

主轴是机器中关键的部件之一&#xff0c;其主要作用是传递动力并驱动机器运转。由于长期使用或其它因素&#xff0c;主轴可能会出现磨损、弯曲、变形等问题&#xff0c;这些问题都会影响机器的正常运转和精度。因此&#xff0c;对主轴进行及时维修和保养对于保证机器的正常运转…

【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(上)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请联系助理老师 peaeci122 使用最新“KerasCV YOLOv8”模型进行红绿灯检测的综合指南 YOLO目标检测模型已经进入了无数的应用领域&#xff0c;从监控系统到自动驾驶汽车。那么&#xff0c;如果在KerasCV框架下…

01背包(一) 01背包(二)动态规划

01背包&#xff08;一&#xff09; 二维数组 题目 背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品1320物品2430 问背包能背的物品最大价值是多少&#xff1f; 创建二维数组&#xff0c;dp[i][j]的含义是任意放入前 i 个物品放进在背包重量为j的时候的最大价值…

openssl生成SM2公私钥对命令详解

&#xff08;1&#xff09;获得openssl支持椭圆曲线算法列表 命令&#xff1a;openssl ecparam -list_curves 返回结果&#xff1a; secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SE…

051:mapboxGL改变bearing和pitch,变换查看视角

第051个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中改变bearing和pitch,变换查看视角。bearing:地图的默认方位角(可选,表示 地图视口正上方中心点 在地图上 北偏东 的角度。默认值为 0)。pitch:地图的默认倾斜角度(可选,默认值为 0,范围为 0 ~ 85)。 直…

《持续交付:发布可靠软件的系统方法》- 读书笔记(四)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;四&#xff09; 第 4 章 测试策略的实现4.1 引言4.2 测试的分类4.2.1 业务导向且支持开发过程的测试4.2.2 技术导向且支持开发过程的测试4.2.3 业务导向且评价项目的测试4.2.4 技术导向且评价项目的测试4.2.5 测试替身 …

如何获取跑腿App源码并定制化你的业务

跑腿App源码是开发送货和快递服务平台的理想起点。它为你提供了一个现成的应用程序框架&#xff0c;可以帮助你快速进入这个竞争激烈的市场。本文将指导你如何获取跑腿App源码&#xff0c;以及如何将其定制化以适应你的业务需求。我们将以一个示例项目为基础进行说明。 步骤1…

故障维修无忧服务:OLED透明拼接屏的专业技术支持与保修服务

OLED透明拼接屏作为未来显示技术的领军者&#xff0c;以其卓越的画质和全方位的优势在市场上备受推崇。 本文将深入探讨OLED透明拼接屏的画质特点和独有的优势&#xff0c;并为您提供选购指南、价格表以及故障维修服务&#xff0c;助您了解并选择最适合的OLED透明拼接屏。 一、…

软考-系统开发基础

软件开发模型 瀑布模型 瀑布模型的优点是&#xff1a;容易理解&#xff0c;管理成本低&#xff1b;签掉开发阶段早期计划及需求调查和产品测试 V模型 V模型是瀑布模型的一个变体 注重测试&#xff0c;但测试放在编码之后 喷泉模型 原型模型 螺旋模型 综合了瀑布模型和原型模…

蔬菜水果生鲜配送团购商城小程序的作用是什么

蔬菜水果是人们生活所需品&#xff0c;从业者众多&#xff0c;无论小摊贩还是超市商场都有不少人每天光临&#xff0c;当然这些只是自然流量&#xff0c;在实际经营中&#xff0c;蔬菜水果商家还是面临着一些难题。 对蔬菜水果商家而言&#xff0c;线下门店是重要的&#xff0…

ubuntu 20.04 使用systemback自定义系统镜像和系统备份

ubuntu 20.04 使用systemback自定义系统镜像和系统备份 Systemback简介1. 安装 systemback16.0418.04 查看 2. 使用 systemback创建自定义镜像制作镜像制作中制作完成将镜像写入U盘 Systemback简介 Systemback是一个简单的系统备份和恢复应用程序&#xff0c;根据GPLv3许可条款…

2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]

自动驾驶卡车的技术原理是通过电脑算法控制车辆行驶&#xff0c;辅助驾驶员完成任务。其实现方式主要是基于传感器和计算处理技术。自动驾驶卡车可以随时感知周围环境&#xff0c;灵活避障&#xff0c;自适应调整行驶路径&#xff0c;相比之下传统卡车需要驾驶员进行手动操作&a…

2023最新闪聊远程获取通讯录PHP源码/附安装教程/php即时聊天源码/获取闪聊通讯录源码

源码介绍&#xff1a; 闪聊远程获取通讯录PHP&#xff0c;首先你需要在服务器上搭建Nginxmysql5.6php5.6phpMyAdmin的环境。接着&#xff0c;在app/database.php中配置好数据库路径。最后&#xff0c;在宝塔面板的站点管理中&#xff0c;将伪静态设置为tphinkphp即可。这样一来…

免费office安装工具箱(可安装任意版本)

Office Tool Plus v10.0.5.2 -office安装工具箱 Office Tool Plus是一款相当好用的office安装工具&#xff0c;并且安装完了顺带激活。借助Office Tool Plus&#xff0c;可以一次性安装Office、Visio、Project&#xff0c;还可以选择不同的授权版本。自定义选择Office的组件&a…