c++高级---C/C++语言void及void指针

ERDAS 2022与ArcGIS共存安装教程:如何避免端口冲突(详细配置步骤) 本文提供了一份详细的ERDAS 2022与ArcGIS共存安装教程,核心在于解决两者因FlexNet许可证服务器导致的端口冲突问题。通过分步指导,包括检查现有端口占用、修改ERDAS许可证文件端口号、配置防火墙及客户端设置,确保两款专业GIS与遥感软件能在同一系统上稳定运行。 阅读详情
1.概述
  许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义
  void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
  void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
  这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。
  void真正发挥的作用在于:
  (1)对函数返回的限定;
  (2)对函数参数的限定。
  我们将在第三节对以上二点进行具体说明。
  众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。  
  例如:
float *p1;
int *p2;
p1 = p2;
  其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:
p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
  但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面的语句编译出错:
void *p1;
int *p2;
p2 = p1;
  提示“'=' : cannot convert from 'void *' to 'int *'”。

3.void的使用
  下面给出void关键字的使用规则:
  规则一如果函数没有返回值,那么应声明为void类型
  在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。但是许多程序员却误以为其为void类型。例如:
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
  程序运行的结果为输出:
   2 + 3 = 5
  这说明不加返回值说明的函数的确为int函数。

  林锐博士《高质量C/C++编程》中提到:“C++语言有很严格的类型安全检查,不允许上述情况(指函数不加类型声明)发生”。可是编译器并不一定这么认定,譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确,所以不能寄希望于编译器会做严格的类型检查。
  因此,为了避免混乱,我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为void类型。这既是程序良好可读性的需要,也是编程规范性的要求。另外,加上void类型声明后,也可以发挥代码的“自注释”作用。代码的“自注释”即代码能自己注释自己。
规则二如果函数无参数,那么应声明其参数为void
  在C++语言中声明一个这样的函数:
int function(void)
{
return 1;
}
  则进行下面的调用是不合法的:
function(2);
  因为在C++中,函数参数为void的意思是这个函数不接受任何参数。
  我们在Turbo C 2.0中编译:
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}
  编译正确且输出1,这说明,在C语言中,可以给无参数的函数传送任意类型的参数,但是在C++编译器中编译同样的代码则会出错。在C++中,不能向无参数的函数传送任何参数,出错提示“'fun' : function does not take 1 parameters”。
  所以,无论在C还是C++中,若函数不接受任何参数,一定要指明参数为void。
  规则三小心使用void指针类型
  按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:错误

pvoid += 1; //ANSI:错误
//ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
//例如:
int *pint;
pint++; //ANSI
:正确
  pint++的结果是使其增大sizeof(int)。
  但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定,它指定void *的算法操作与char *一致。
因此下列语句在GNU编译器中皆正确:
pvoid++; //GNU:正确
pvoid += 1; //GNU:正确
  pvoid++的执行结果是其增大了1。
  在实际的程序设计中,为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:
void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确

(char *)pvoid += 1; //ANSI:错误;GNU:正确
  GNU和ANSI还有一些区别,总体而言,GNU较ANSI更“开放”,提供了对更多语法的支持。但是我们在真实设计时,还是应该尽可能地迎合ANSI标准。
  规则四如果函数的参数可以是任意类型指针,那么应声明其参数为void *
  典型的如内存操作函数memcpy和memset的函数原型分别为:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
  这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。如果memcpy和memset的参数类型不是void *,而是char *,那才叫真的奇怪了!这样的memcpy和memset明显不是一个“纯粹的,脱离低级趣味的”函数!
下面的代码执行正确:
//示例:memset接受任意类型指针
int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //
将intarray清0

//示例:memcpy接受任意类型指针

int intarray1[100], intarray2[100];
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //
将intarray2拷贝给intarray1
  有趣的是,memcpy和memset函数返回的也是void *类型,标准库函数的编写者是多么地富有学问啊!
  规则五 void不能代表一个真实的变量
  下面代码都企图让void代表一个真实的变量,因此都是错误的代码:
void a; //错误
function(void a); //错误
  void体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。
  void的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void数据类型。正如不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void为“抽象数据类型”)变量。
 
4.总结
  小小的void蕴藏着很丰富的设计哲学,作为一名程序设计人员,对问题进行深一个层次的思考必然使我们受益匪浅
AI辅助决策支持系统架构设计避坑:5个常见技术选型误区及正确方案 AI辅助决策支持系统(AI-DSS)是指通过人工智能技术(机器学习、自然语言处理、知识图谱等)赋能传统决策支持系统,帮助决策者在复杂业务场景中(如供应链优化、风险控制、医疗诊断、金融投资等)提升决策效率和准确性的系统。与传统BI工具不同,AI-DSS不仅能"展示数据",还能基于数据生成"决策建议"甚至"自动执行决策"。技术选型是AI-DSS架构设计的核心环节,涉及数据处理引擎、模型框架、算力资源、集成接口等关键组件的选择。效果不达标:模型预测精度低、决策建议不可用;成本失控:算力资源浪费、维护成本高企。 阅读详情

相关推荐

一种四通道高精度IEPE加速度传感器控制器设计稿

一种四通道高精度IEPE加速度传感器控制器设计稿,颇具参考价值。

boyondmcu的博客 3850

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

void关键字 C++指针

weixin_43443648的博客 1万+

【EtherCAT实践篇一】TwinCAT 3安装、使用

FULL(XAE)安装包:包含了XAR的功能,并能进行多种语言的编程和硬件组态,通常安装在编程电脑上;XAR安装包:包含了ADS的功能,是实时运行环境,对 TwinCAT 模块进行加载、执行、管理、实时运行与调用,通常安装在PLC中;RM安装包:在装了高版本的TwinCAT 3后,发现PLC中的TwinCAT版本较低,就需要安装相应低版本的RM安装包切换版本使用(注:4024无法使用RM安装包切换到低于4022的版本,如4020/4018/4016版本。

JXES智能生态系统 5118

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

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

chinaplus的专栏 950

自举电容的工作原理-3句话总结

1、一道面试题 照例,先抛出来一道面试题:“Buck电路的SW引脚通常会放置一颗小电容,这颗电容有什么用?”。这个问题问得比较细,非常考验被面试者的硬件基本功。 2、似懂非懂的答案 有小伙伴可能不太清楚这颗电容的作用,回答不上来。也有小伙伴脱口而出:自举电容,用来做升压的。但后面好像说不出来具体逻辑。 没具体了解过,答不上来,也没啥可惜的。但是了解过一点,但又似懂非懂的这种,给出的答案只是轻轻点水或者千篇一律,那无疑是错过了一个加分项。 3、异步Buck的自举环路组成 既然是针对Buck电路讲自举电容,前面

ltqdxl的博客 3万+

【UE5+Quest3】手部模型替换---3-0

这次手部模型替换遇到了一些小问题,不过好在是bug一个个都处理掉了,我会分开几个章节去整理。详细的视频教程可以参考油管大佬的视频手部素材放到文章末尾,自行下载使用。(仅用作学习研究,不可用于商用)

qbbmnnnnnn的博客 944

void类型和void* 的用法

C语言中的void 和 void * 总结 1、void的作用   c语言中,void为“不确定类型”,不可以用void来声明变量。如:void a = 10;如果出现这样语句编译器会报错:variable or field ‘a’ declared void。   在C语言中void 常常用于:对函数返回类型的限定和对函数参数限定     (1)对函数返回类型的限定:当函数不...

dianzhi8696的博客 2048

【生产实践】SSH服务弱加密算法修复指南(附完整操作流程)

SSH服务弱加密算法漏洞修复方案 检测发现SSH服务存在支持弱加密算法漏洞,主要风险包括: 使用arcfour、aes128-cbc等易被破解的算法 面临密钥恢复、重放攻击等安全威胁 提供两种修复方案: 推荐方案:升级OpenSSH至最新版本 替代方案:修改SSH配置禁用弱算法(需注意可能影响旧客户端连接) 修复步骤: 编辑/etc/ssh/sshd_config 注释或删除弱算法配置 添加强加密算法(如aes128-ctr等) 重启SSH服务 注意事项: 建议先在测试环境验证 可能需配合客户端升级 操作前

SunMy的博客 3094

void类型及void指针

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

饿的神啊 6110

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

提升YOLOv8检测精度的边界框损失函数Focaler-IoU与InnerFocalerIoU的应用与效果

YOLOv8是一种常用的实时目标检测模型,基于CNN(卷积神经网络)结构并结合了一些改进技术以提高检测精度和速度。YOLOv8的核心在于边界框的预测和分类,而准确的边界框预测是提高模型整体性能的关键因素之一。在传统的IoU损失基础上,Focaler-IoU和InnerFocalerIoU进一步聚焦于边界框的边缘区域,通过调整损失权重,更好地关注难以检测的边界框,提高模型的鲁棒性和准确性。# 计算IoU# 计算Focaler-IoU损失在这里,我们定义了。

博客 1340

嵌入式C_C++语言精华——笔记

Break和continue语句都可以用在循环中,用来跳出循环(结束循环);break语句还可以用在switch语句中,用来跳出switch语句。 Break语句通常用在循环语句和开关语句中。当break用于开关语句switch时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。 当break语句用于do-while、for、while循环语句时,可使程序终止循环而执行循环后面的语句,通常break语句总是与if语句连在一起,即满足条件便跳出循

苏幕遮 641

AI智能体实战:从LangChain到多智能体协作的自动化新范式

在人工智能技术快速发展的今天,大语言模型(LLM)已成为推动自动化变革的核心驱动力。其原理在于通过深度学习海量文本数据,使模型能够理解、生成自然语言并执行推理任务。这一技术进步催生了AI智能体(AI Agent)这一新兴概念,它赋予自动化系统自主决策和动态规划能力,从而突破了传统脚本和RPA工具在固定流程上的局限。从技术价值看,AI智能体框架通过封装LLM调用、工具集成与流程编排,显著降低了构建复杂人机协同应用的开发门槛。在实际应用场景中,智能体尤其擅长处理信息调研、内容创作辅助、数据分析等需要处理非结构化

weixin_33730836的博客 773

c语言指针的程序,神一般的C语言指针

今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。1.int *p;2.int **p;3.int *p[10];4.int (*p)[10];5.int *p(int);6.int (*p)(int);7.int (*p[10])(int);这七个难度还不是很大,相信大多数...

weixin_39886469的博客 133

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[C] 神一般的C语言指针,你看懂多少?

今天阅读《C/C++程序员面试指南》中指针一块,以前一知半解的指针问题顷刻间懂了。 下面,可以做个测试,如果下面的指针问题你能够全都解答正确,那么你的C语言功底真是神一般的了。 1.int *p; 2.int **p; 3.int *p[10]; 4.int (*p)[10]; 5.int *p(int); 6.int (*p)(int); 7.int (*p[10])(int);...

weixin_30389003的博客 231

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

软件

测试常用术语 C/C++语言void及void指针深层探索 并行编程中的“锁”难题(好文 收藏) 重定位很好的文章 GDB调试精粹及使用实例 缓冲区溢出原理学习 c/c++中的一些基础但必须熟记的知识

gpchen111的博客 382

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

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

指针与函数指针

指针与函数指针 前面一直都没有讲到指针的东西,但是昨天被小伙伴私信让我写一下指针 那今天就来写一些C/C++最有特色的东西–指针 要强调的是,在很多语言如Java当中,都没有指针的概念 那么C/C++的指针为我们提供了对内存区域的任意访问和读写 形象的说,内存每个字节就像是酒店里面房间,内存地址就是相应的房间编号,而指针存放着的就是房间号 指针的定义 int *p; char *pc; float...

Garyboyboy的博客 741

void * 初探

① void* 表示一个白板指针,任何类型的指针都可以赋值给void*类型的指针 ②void* 类型的指着一旦接受了一种类型指针的赋值之后就不能改变,只能在使用时转换为这一类型 例子: #include<iostream> using namespace std; int main() { int a = 10; void *b = &a;//void *b这个b...

Pichairen 410

C/C++编程笔记:指针篇!从内存理解指针,让你完全搞懂指针

C语言最核心的知识就是指针,所以,这一篇的文章主题是「指针与内存模型」!说到指针,就不可能脱离开内存,学会指针的人分为两种,一种是不了解内存模型,另外一种则是了解。 不了解的对指针的理解就停留在“指针就是变量的地址”这句话,会比较害怕使用指针,特别是各种高级操作。而了解内存模型的则可以把指针用得炉火纯青,各种 byte 随意操作,让人直呼 666。 注:这篇文章好好看完一定会让你掌握好指针的本质! 一、内存本质 编程的本质其实就是操控数据,数据存放在内存中。 因此,如果能更好地理解内存的模型,

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

【C/C++】一文带你彻底玩转C/C++中的指针!(万字解读,非常详细!适合初学者或老手回顾)

万字详细解读指针个各项用法和细节。从指针入门到深入理解。

greatming666的博客 1万+

C/C++指针的前世今生

指针是一种抽象的思想,是一种数据类型,用于表示内存中的地址,就像int,double,string一样;指针变量是一种变量,用来存储地址数据。指针常量(T *const):指针的地址不能修改,指向的数据可以修改。常量指针(const T *):指向的数据不能修改,指针的地址可以修改。常指针常量(const T *const):指针的地址和指向的数据都不能修改。

m0_71489826的博客 2232

C/C++ 指针

int * p1;//定义p1为指向整型变量的指针变量char * p2;//定义p2为指向字符变量的指针变量指针变量的类型, 是指针所指向的变量的类型, 而不是自身的类型。因此,指针变量的类型与它所指向变量的类型必须一致{ int *p1;//定义p1应指向一个整型变量p1=&x;//将一个实型变量的地址赋给p1这段代码会报错,p1只能指向整型变量, 不能指向实型和字符型变量。

葱卤山猪的博客 2611

不懂 void *,也敢说是C/C++高手?

摘要 本文深入探讨了C/C++中的void*指针,强调其在内存管理、泛型编程和系统开发中的核心作用。void*作为无类型指针,可指向任意数据类型,但需显式类型转换才能解引用或运算。文章详细解析了void*的特点(无类型性、安全性限制)、典型用途(泛型函数/数据结构、内存操作、跨类型传递)及使用规范(赋值转换、解引用前提、运算限制),并对比了C与C++的差异。通过停车场等类比,帮助读者理解这一“万能容器”的灵活性与潜在风险,适合嵌入式开发者及系统程序员深入学习。 关键词:void*、通用指针、类型转换、内存管

萧邯嵌入式笔记 1202

C语言——指针的高级引用

动态内存分配二级指针:啥叫函数指针:啥叫往往出现在在一个函数中free过,后来忘记了又在另一个中free。所以说free交给特定函数销毁(就像专门的人做清洁)和creat函数一样,需要注意这点!

weixin_61057535的博客 2382

C/C++指针&智能指针一

本文主要讲解了指针的基础概念以及使用,通过这篇文章一定会增加你对指针的认识和理解。

weixin_73497355的博客 1322

C语言的指针

在编程中,指针与地址是同一个概念,因此可以先从地址的角度理解指针。编程中的地址可以说是对实际生活中地址的抽象,比如在收发快递时,快递员通过提供的地址,就可以准确的定位到你家的位置。对应到编程中,可以说操作系统对每字节的内存空间都进行了编号,通过这个编号,就可以准确定位到每字节的内存空间,这个编号,就是所谓的指针,并且我们在大多数情况下并不关注指针本身,而是关注通过这个指针能够找到的资源数据。然后很自然的会产生一个问题:操作系统是怎么产生这些编号的?

TCW1121的博客 1486
上一篇: HTML中添加flash、视频、声音
下一篇: c++指针深入全面总结--包括对象数据成员和成员函数的指针
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值