C++:指针:void*指针(跳跃力未定的指针)

news2024/9/26 1:24:47

先分享一段代码,觉得很有意思

#include<iostream>
void* say_hello(void* args){

    std::cout<< "Hello world"<< std::endl;
    return 0;
}

上面这段代码,我们看到函数的返回值类型竟然是 void*  ,形参也是 void*  ,按照一般的理解,如果返回值和形参都是 void 的,那么返回值直接写一个 void 的,形参直接不写就可以。为什么要这样多此一举了 ?

1:void* 到底是什么

在C语言中,*类型就是指针类型,比如 int *p  ,double* q 。这个虽然是不一样的指针,但是大小是一样的(sizeof(p) == sizeof(q)),因为他们都是同一种 *类型(或者因为他们保存的是变量的地址,而变量地址大小由于系统结构决定),那int *p  ,double* q到底有什么不同 ? 看下图

  •  很明显,当指针偏移一个位置时候,int *p 和double *q 指向的位置是不一样的。
  • 也就是说:对指针而言,如果我们在前面规定了它的类型,那就是相当于决定了它的“跳越力”。“跳跃力”就比如说上面: int 类型跳越了 4字节, double类型跳越了 8字节。
  • 基于这样的理解,那么 void* 的定义就是 : void *是一个跳跃力未定的指针。

1.1 那么跳跃力什么时候定:

这就是它的神奇之处了,我们可以自己控制在需要的时候将它实现为需要的类型。这样做的好处就是节约代码,实现泛型编程。

2:void* 详解

2.1 :void* 可以指向任何类型的指针,但是带类型的指针不能指向void* 指针

正常来说如果两个指针类型不一样的话,两个指针变量是不可以直接相等 赋值得,例如: int *a , float *b  ,如果令:  a=b 这个是会编译报错的,但是void* 指针可以等于任何类型的指针。

int * a ;

float *f;

a= b;  // 编译会报错的

    void* pv;
    float f = 5.5;
    float* pf = &f;
    pv = pf;    // 这样是没问题

2.2 void* 指针只有进行了强制类型转换才可以正常取值


// void* 类型指针解析

#include<iostream>
using namespace  std;

int main() {
	void* pv;
	float f = 5.5;
	float* pf = &f;
	pv = pf;
	 
	//cout << *pv << endl;  // 语法错误:表达式必须是指向完整对象类的指针
	cout << *(float*)pv << endl; //强制类型转换后,可以取值
}

// 打印结果: 5.5

2.3:void*指针变量和 普通指针一样可以通过 等于0或者 NULL来初始化,以此表示一个空指针

void *pv = 0;

void  *pv2 = NULL;

cout<<pv<<endl;  //打印值为 0x0;

cout<<pv2 <<endl;  //打印值为 0x0;

2.4: 当void* 指针作为 函数的输入和输出时,表示可以接受任意类型输入指针和输出任意类型的指针


// void* 类型指针解析

#include<iostream>
using namespace  std;

void* test(void* a) {
	return a;
}

int main() {

	static int a = 5;
	int* pi = &a;

	cout << "变量a的地址:" << &a << endl;
	cout << pi << endl; // 输出变量a的地址
	cout << test(pi) << endl;
	cout << test((void*)pi) << endl;

}


变量a的地址:00C2C000
00C2C000
00C2C000
00C2C000

3:应用场景

3.1:函数传参时不确定类型,或者支持多类型的传参


void function(int dataType, void* data) {
 
    // 根据dataType的不同值,进行不同的转换
    switch (dataType) {
 
        case 0:
            int* a = (int*)data;
 
        case 1:
            char* a = (char*)data;
 
        ...
    }

3.2 函数的繁殖值不考虑类型(不关心大小的时候)

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

memcpy和memset 对外接收任何类型的指针,这样是合理且必要的,因为这是内存操作函数,是对bit 进行操作,考虑数据的类型事没有任何意义的 。

同样的,malloc函数只关注你要多大内存,你申请到这个内存之后,至于你怎么使用划分是你自己的事情,但是你需要显示的表明你是怎么划分的,所以这里需要将 void* 类型转化为具体的数据类型

int *a=NULL;
 
a=(int *)malloc(sizeof(int));//返回的是void*,所以赋值给其他指针类型要强转一下

3.3  在函数调用过程中的使用作为输入输出参数也非常好用,可以灵活使用任意类型的指针,避免只能使用固定类型的指针。 

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

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

相关文章

限时开源,一份“扭转乾坤”的与时俱进的1700页Java八股文

今天在某客看到一个程序员自述&#xff0c;内容如下&#xff1a; 人到三十&#xff0c;公司效益不好被裁员&#xff0c;两个月时间面了三十几家&#xff0c;一直不是很顺利&#xff0c;面试问八股&#xff0c;根本答不上来。前期不信邪&#xff0c;正常投简历正常面试&#xf…

如何借助现有股票量化交易平台编写策略和回测分析

每个交易日的股票都会上涨或者下跌&#xff0c;在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控&#xff0c;或者自动进行交易&#xff0c;在这个需求前提下&#xff0c;现有券商、股票分析软件都会带有机器人自动交易策略功能&#xff0c;大部分都需要收费或…

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

OAuth2 的授权流程

文章目录&#x1f4d6; OAuth2 的授权流程&#x1f4d1; 参与的角色&#x1f4d1; 授权流程&#x1f4d1; 授权许可 Authorization Grant&#x1f4d1; 直白话 OAuth2 流程&#x1f4d6; OAuth2 的授权流程 &#x1f4d1; 参与的角色 1️⃣ Resource Owner资源所有者&#xf…

如何监听电脑屏幕是否发生切换

目录 1.屏幕监听的原理&#xff1a; 2.创建项目 3.离开计时 1.屏幕监听的原理&#xff1a; 为什么可以监听浏览器窗口的切换呢&#xff1f;那就是利用了浏览器的visibilitychange属性&#xff0c;MDN的介绍对visibilitychnge的介绍是&#xff1a; 当其选项卡的内容变得可见或…

nginx(六十二)proxy模块(三)接收用户请求的包体

一 接收用户请求包体 nginx读取请求体的源码分析 说明&#xff1a; 虽然是被http core核心框架处理,但是被proxy反向代理模块使用重点&#xff1a; 哪些指令控制接收request body的行为? ① proxy_request_buffering 控制&#xff1a; nginx接收客户端 request body的方式…

【优化选址】遗传算法求解物流配送中心选址【含Matlab源码 1917期】

⛄一、物流选址简介 1 引言 配送中心是物流系统网络中的关键节点和重要的基础设施&#xff0c;在整个物流系统网络规划中起着枢纽性的作用[1]。快递物流配送中心选址是指在具有若干个发件网点或者若干个收件网点的物流配送区域内&#xff0c;综合考虑物流运输成本、配送中心建…

【计算机网络】Servlet API重点知识汇总

目录 1.HttpServlet&#xff1a; 2.HttpServletRequest&#xff1a; 3.HttpServletRequest代码实例&#xff1a; 3.1.打印请求的内容&#xff1a; 3.2.获取请求中的重要参数 &#xff08;query string中的值&#xff09;&#xff1a; 3.3.获取请求中的重要参数 &#x…

关于循环浅析

从c,c,python,scala到java&#xff0c;简单接触了这样一些编程语言&#xff0c;对于它们的基本语法中的循环想做个总结。 一、c&#xff0c;c C语言for循环&#xff08;for语句&#xff09;详解 (biancheng.net) //这个链接比较详细&#xff0c;本人也从中摘取了一些知识点。…

【javaEE】网络原理(传输层Part2)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言TCP相关机制4. 【滑动窗口】5.【流量控制】6.【拥塞控制】总结前言 一个人最大的痛苦来源于对自己无能的愤怒&#xff01; Hi&#xff0c;这里是不想秃头的宝贝儿&#xff01; 本文主要内容是 传输层中TCP相关…

什么是SRM,SRM有什么作用,SRM主要用途是什么?

简道云SRM管理应用一、什么是SRM? SRM是 Supplier Relationship Management 的英文缩写&#xff0c;即供应商关系管理。 SRM的最基本内容包括供应商分类选择、战略关系发展、供应商谈判和供应商绩效评价四个方面。 SRM是用来改善企业与供应商的关系&#xff0c;它是一种致力…

了解一下OAuth2.0到底是什么,有图解有案例

理论 OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;用来授权第三方应用获取用户数据&#xff0c;是目前最流行的授权机制&#xff0c;它当前的版本是2.0。 应用场景 假如你正在“网站A”上冲浪&#xff0c;看到一篇帖子表示非常喜欢…

Python交互Mysql数据库基本操作

安装pymysql第三方包 1. 安装pymysql 2. 查看安装情况 ​ 3. 卸载pymysq ​ Pymysql的使用 1. 导包 ​ 2. 创建和mysql服务端的连接对象 ​ 3. 获取游标对象 ​ 4. 执行sql语句 ​ 5. 获取查询结果集 ​ 6. 将增加和修改操作提交到数据库 7. 回滚数据 8. 关闭游标对象 …

【网页设计】期末大作业html+css(体育网站--足球 6页 )

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 校园篮球网页设计 | 足球体育运动 | 体育游泳运动 | 兵乓球 | 网球 | 等网站的设计与制作 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&…

mTD-SCDMA与TD-LTE双网络垂直切换matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 TD-SCDMA与TD-LTE共覆盖的范围内覆盖半径1000m&#xff1b; TD-SCDMA中心坐标(0,0)&#xff0c;覆盖半径1000m&#xff1b; 两个TD-LTE基站的中心坐标为&#xff08;150&#xff0c;0…

刚毕业被骗去了小公司,天天“取数做表”,后悔没早点用上这工具

经常看到年轻人提问“究竟是去大公司打杂好&#xff0c;还是去小公司磨练好&#xff1f;”这个问题我年轻的时候也想过&#xff0c;当时觉得去大公司只能当螺丝钉&#xff0c;做按部就班的工作&#xff0c;于是毅然决然放弃了大厂offer去了一家IT部门只有3个人的公司。当时我在…

通过电子文档管理改善患者体验和办公效率

通过电子文档管理改善患者体验和办公效率 在不远的过去&#xff0c;手动输入医疗信息和物理归档系统是所有医疗办公室的标准操作程序。医生和工作人员别无选择&#xff0c;只能写下信息&#xff0c;然后手动将数据输入办公系统。 当要求所有从业者使用电子病历的授权作为“患…

亚马逊买家号造成被封的原因有哪些?

现在很多人反馈说亚马逊买家号太容易被封了&#xff0c;去下单时都不知道什么情况都就砍单&#xff0c;账号登录不上了&#xff0c;而关于亚马逊买家号被封这个问题&#xff0c;不是一两个因素就能决定的&#xff0c;那么亚马逊买家号造成被封的原因有哪些&#xff1f; 1、账号…

虚拟机三种网络模式

基本知识 ipconfig查看信息。 网关(Gateway)又称网间连接器、协议转换器。是你连接到的上层节点的地址。 ip地址是你本身的地址&#xff08;如果是路由器分配的 那么是路由器所构建的内网地址&#xff09; 网卡&#xff1a;需要网卡才能连接其他设备 是设备端的 交换机&#x…

[附源码]SSM计算机毕业设计教师业绩考核系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…