C/C++语言中的void及void指针总结

c++中的void* 今天看到一段代码,觉得非常有意思。 void* say_hello(void* args) { cout << "Hello World!" << endl; return 0; } 这里的返回类型竟然是void*。一般来说如果没有返回值,那么写一个void就行了,void*到底是什么样的存在?所以做了一些测试,总结了一些void*指针的... 阅读详情

一、void 和 void* 含义

      void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

      对于void,如果定义void  a;是会编译出错的(vc6下得到:error C2182: 'a' : illegal use of type 'void',vs08中: error C2182: “a”: 非法使用“void”类型)

       对于void*,任何类型的指针都可以直接赋值给它,无需进行强制类型转换。

 这样是正确的,不过不能将int*转换为void*

二、我们在什么地方能用到void和void*

1、对于void,发挥作用的有两个地方:一是对函数返回值的限定,二是对函数参数的限定。下面举例说明:

(林锐的《高质量c++编程指南》上有以下3个对void和void*的使用的类似示范,即,如没有参数,一定要写明void;如没有返回值,一定标注;如果函数参数可以为任意类型指针,声明函数参数为void*)

1)对于返回值的限定

     上述程序,在C语言中运行是没有任何问题的,因为c语言中,函数如果没有返回值限定,则编译器默认返回为int来处理。虽然看起来会以为返回void。

     但是在c++中,类似代码:

 

     在vc6中编译依旧没有问题的,但是在vs08中测试,会得到错误:error C4430: 缺少类型说明符 - 假定为 int;在gcc下编译会出错:error: ISO C++ forbids declaration of 'add' with no type。

     这里需要注意的是: C++ 不支持默认 int   因为,C++语言有很严格的类型安全检查,不允许函数不加类型声明的情况发生。因此,为了避免混乱,如果函数没有返回值,一定要声明为void类型。

     说到返回值,顺便提一下,在C++中对函数的重载,是不能通过返回值实现的,因为如同这个示范程序,调用add函数而忽略了其返回值,也就是使用了函数的副作用。

2)对参数的限定

 

   说明,C语言中,可以给无参数的函数传送任意类型的参数,当然,这不安全(C99以后C语言有没有改进不知)

   而在c++中,会得到提示错误:error C2660: 'fun' : function does not take 1 parameters(vc6下)或 error: too many arguments to function 'int fun()'(gcc下)

   所以,无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。

2、void*

    对于void*,也许最常见的应该是库函数吧,像memset,malloc,memcopy。

    内存操作函数memcpy和memset的函数原型分别为:

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

    这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型

    malloc原型如下:

 

    extern void *malloc(unsigned int num_bytes);

    对于malloc,函数可以保证返回的内存是地址对齐的(怎么保证的楼主也不知道,《linux程序设计(第4版)》217页描述,待查证),所以,它可以被转换为任何类型的指针。

 

 

    有没有觉得库函数的设计者的确很有远见啊,哈哈

 

3、总结

     对于小小的void和void*,其实还是蛮有学问的,从中,可以看到操作的不断严谨,可以看到设计者的远见,也更提醒我们啊,coding的时候,要尽可能的严密啊。正好碰到了,搜资料,总结然后敲字于此,以备忘,同时,更希望对大家有用。

 

 

参考网址:http://developer.51cto.com/art/200510/9059.htm

C/C++中void用法总结 这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。void的字面意思是“无类型”,void* 则为“无类型指针”,void *可以指向任何类型的数据。 阅读详情

相关推荐

SAP 物料主数据中 Base Unit of Measure 的变更逻辑与落地检查

摘要:SAP物料主数据中的Base Unit of Measure(基本计量单位)并非普通字段,它关联库存、采购、销售等核心业务数据。官方建议在物料创建初期慎重选择该单位,因其变更将影响历史业务数据的语义一致性。系统对修改设有严格限制:库存必须为零,且无相关采购订单等未清业务。实际项目中,更推荐使用替代计量单位而非直接修改基础单位,以避免数据断层风险。变更前需全面检查相关业务对象,并建立完善的治理流程。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1万+

C++基础(五)--void关键字

void关键字 C++指针

weixin_43443648的博客 1万+

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 321

C语言-void与void*详解

内容包括void的含义与使用、void (*b[10]) (void (*)( ));的解说。

让你爱上电路设计 8468

android 运动目标检测_MindSpore应用案例:AI对篮球运动员目标的检测

MindSpore作为一个端边云协同的开源的全场景AI框架,今年3月份开源以来,受到了业界的广泛关注和应用,欢迎大家参与开源贡献、模型众智合作、行业创新与应用、学术合作等,贡献您在云侧、端侧 (HiMindSpore 应用程序)、边侧以及安全领域的应用案例。MindSpore与您在AI领域共同成长,让AI使能千行百业,释放出强大的生产力。本文讲述的是MindSpore对篮球运动员目标的检测应用,通...

weixin_33603813的博客 832

保姆级教程:用Adams/Car和Simulink搞定你的第一个整车联合仿真(附模型文件)

本文提供了一份详尽的Adams/Car与Simulink联合仿真教程,涵盖从环境配置到模型导出的全流程。通过实战案例解析,帮助工程师快速掌握多体动力学仿真与控制算法开发的集成技术,特别适合汽车工程领域的初学者。文章还包含常见问题解决方案和性能优化建议,助您高效完成整车联合仿真项目。

weixin_29663861的博客 337

C/C++语言中的void及void指针类型

1.概述  许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。2.void的含义  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。  void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变

翁中鳖VC的专栏 831

使用再生龙备份还原liunx系统(精确每一步)

再生龙镜像可自行到官网下载(ISO/ZIP格式均可),然后使用tuxboot烧录工具制作启动盘,另外准备一个U盘用来存储备份的镜像文件,即再生龙盘和存储盘是两个分开的。当然也可以用分区工具把同一个硬盘分区来使用,比较方便,先学会基本的吧,只是告诉有个捷径,省个U盘。

米可的博客! 8361

C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针

什么是万能指针? 万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。 因为void指针不属于任何类型,不可以对其进行算术运算,比如自增,编译器不知道其自增需要增加多少。 而对于char *型指针,自增一定是指针指向的地址加1,int*型指针自增,则偏移4。这个在指针的运算中p+n的解释中已经很详细的介绍过,这里不再累赘,有兴趣的可以自行查阅。 在C/C++中,在任意..

致力于C语言C++知识分享! 1295

Office 365中的Assigned Access详细功能介绍

本文系统介绍了Office365中AssignedAccess功能的应用与管理。作为Windows系统的重要安全特性,AssignedAccess可将设备锁定为单应用模式,有效防范未授权访问。文章详细阐述了其核心功能、技术架构及配置方法,包括UWP/Win32应用支持、多用户配置、与AzureAD集成等。通过MicrosoftEndpointManager可实现批量部署和远程监控,适用于公共终端、零售设备等场景。该功能为企业数字化转型提供了安全、可控的终端管理方案,在保障数据安全的同时优化用户体验。

xueyunshengling的博客 226

【FPGA教程案例89】编译码2——使用vivado核实现RS信道编译码

RS编码,又称里所码,即Reed-solomon codes,是一种前向纠错的信道编码,对由校正过采样数据所产生的多项式有效。当接收器正确的收到足够的点后,它就可以恢复原来的多项式,即使接收到的多项式上有很多点被噪声干扰失真。

FPGA/MATLAB学习教程/源码/项目合作开发 3540

C/C++语言中的void及void指针类型 (转)

<br />许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 <br /><br />  2.void的含义 <br />  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 <br />  void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: <br /><br />voi

kejinkun的专栏 529

【即插即用模块】Transformer篇 | AAAI 2026 | Circulant Attention:全新ViT自注意力范式,复杂度从O(N²) 降至O(NlogN)!

本文提出了一种基于频域优化的循环注意力模块(Circulant Attention),通过离散傅里叶变换(DFT)将传统自注意力中的矩阵乘法转化为频域元素乘法,显著降低了计算复杂度。该模块采用复数线性层适配频域特征,并引入门控调制机制增强表达能力,在保持全局依赖捕捉能力的同时,将复杂度从O(N²)降至O(NlogN)。实验表明,该模块在多种视觉任务中均能提升模型性能,且计算效率更高。适用于需要高效全局注意力的视觉Transformer架构,可作为传统自注意力的替代方案。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 150

判断void*参数类型_C/C++编程笔记:C语言精华解析之void *指针,指针中的万能指针...

什么是万能指针?万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。 因为void指针不属于任何类型,不可以对其进行算术运算,比如自增,编译器不知道其自增需要增加多少。而对于char *型指针,自增一定是指针指向的地址加1,int*型指针自增,则偏移4。这个在指针的运算中...

weixin_39757893的博客 999

使用 Fargate 在 AWS ECS 上运行 Spring Boot 应用程序

本文介绍了使用AWS Fargate支持的ECS部署SpringBoot应用的完整流程。主要内容包括:1)将SpringBoot应用打包为Docker镜像并推送至ECR;2)创建任务定义配置CPU、内存和网络等参数;3)设置ECS服务管理任务运行;4)配置负载均衡器分配流量;5)设计VPC网络和安全组规则确保安全访问;6)使用SSM参数存储管理敏感信息。整个过程实现了无服务器化部署,既保持了应用控制权,又免除了基础设施管理负担,是扩展Web服务的可靠方案。

介绍AWS Azure GCP devops Terraform 等技术 511

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C/C++语言void及void指针

 1.概述  许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。2.void的含义  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。  void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个vo

yyyuhan的专栏 775

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C/C++语言中void及void指针的深层探索

   

第四跑道 1175

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c语言status和void,C语言中的void和void *详解

1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。2.void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void*可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着...

weixin_29202213的博客 4714

C/C++语言void及void指针深层探索

1.概述  许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对 void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。2.void的含义  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量

yangss2006的专栏 729

[转贴]C/C++语言void及void指针深层探索

C/C++语言void及void指针深层探索   1.概述   许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。   2.void的含义   void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。   vo

小桥加加的IT博客 376
上一篇: c/c++在windows下获取时间和计算时间差的几种方法总结
下一篇: 2011-06-30 人人,人生第一次笔试呢么
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值