从今天开始本菜鸟将就编程里我遇到的一些有意思的东西写点点看法~
取名叫“大话C、C++” 系列吧
早就想自己总结一下关于C、C++里一点关于void的思考了。发现几个非常有意思的地方。
void在C、C++里的意思是“空”。最常用的是,当一个函数不需要返回值的时候,就给它的返回值定义成void。或者一个函数不需要输入参数的时候,也将其定义为void。
“空”,无论是在自然界还是在我们的哲学界都是一个很宽泛的概念。
记得小学的时候,自然数是不包括零的。而不知道从什么时候开始,(貌似是初中),老师又说我们的自然数应该是包括零——因为“无”的概念在自然界中也是天然存在的。可见学术界就关于“空”和 “无”的概念也是模拟两可,争论不断的。
读书前的我们,最自然、感性的理解,“无”就是没有,那么我们就不要去管。
而当我们到小学或者初中的时候,老师反复强调,在理性的范畴内,零这个东西是由意义的。是一个值,一个有意义的载体,而不是一个空洞的不需要理会的东东。
那么在编程里面,我们可以看到
void f( void ) 函数可以简单的写成 f()
又是一个可以“忽略”的东西。
所以,即使在理性的范畴,空 和 无的概念,需要具体按情况来定。
然后我们再看看感性的认识:
佛门经典语句,“色即是空”。
哈哈,用马X克X思的思想来理解这个是彻底的唯心主义了 —— 世间万物形形色色,而在心中这一切对老子心中就如同没有一样。
好了,这个问题交给哲学家。下面来讨论一下C、C++中最有艺术的一个东西 —— void* (一个指向没有的指针)。
老实的说,我在读书时几乎不能理解这个东西。
一个东西既然没有,那么弄一个指针指向它是什么意思?
定义一个void*,就像我对你说:“沿着这条路走吧,这条路将通往虚无”。——你能理解么?
其实不然,当你实际编程中用到void*的时候,就会发现,这是一个偷龙转凤的概念。下面我将“翻译”几个C、C++中的定义。
1.如果可以的话void*可以被转换成任意类型!(如果条件满足的话,无可以衍生出任意东西!)
2.任意类型可以转化为void*(任何东西都可以转化为没有。)
我靠…… 把这两句话综合起来,不就是佛门经典语句“色即是空”“空即是色”了么?
可见C语言的作者,就哲学这块一定有很深的造诣,说不定还是佛教弟子呢。哈哈(just a joke)
******************以下内容非专业人员慎重进入 ^_^**********************
那么编程中void*怎么用呢?举个实用的例子说说吧。
以下对问题进行通俗版和专业版分类,适合于不同读者。 ^_^
先看看问题:
小A对小B说:“我这有三个碗,你给我分别装100粒绿豆、黄豆、黑豆。装完之后叫小C通知我”(A程序启动多个线程,均会调用B函数,同时将C函数注册为回调函数作为参数传入B)
然后小B就一粒一粒的给数啊数啊,直到数满了100粒某种豆子。小B就和小C说:“喂,我数满啦!”(B处理完数据后调用回调函数C,)
小C对小A说:“小B他数满了豆子了!”—— 于是小A很疑惑,他数满什么豆子了?我该放哪个碗里呢?(C函数对数据进行处理,但是此时无法知道当时是哪个线程调用的B函数。)
处理方法一:(非专业人员及在校学生常用)
小A每次对小B说的时候,给一个代号,比如1是装绿豆,2是装黄豆,3是装黑豆。(传入index值)
小B数完后告诉小C,装满啦!代号是XXX,所以你该放到哪个碗里。(index传入回调函数)
小C把豆子放到碗里。(回调函数最终处理)
注:index就是碗的编号啦。(这里程序员一般把静态数组的下标作为index。)
处理方法二:(比较厉害的学生及半专业人员常用)
小A每次不光对小B说装入豆子,还需要把碗给小B。(传入需要处理的地址。)
小B装完后把碗和豆子都给小C。(地址作为参数传给回调函数。)
小C把豆子放到碗里。(回调函数处理最终结果。)
处理方法三:(专业人士用法)
这个不提供通俗版了……不知道怎么写。
多线程调用B函数时传入一个void*值,可以是index,可以地址,可以是线程句柄指针,甚至可以是其他函数。
B函数完成处理后调用回调函数,将void*作为输入参数传入回调。
回调函数解该void*,再进行处理。
所以void*可以在参数类型不确定,或者可以灵活变动时使用,适当的使用void*,将为你的客户程序员提供极大的便利!
******************************************************************
说得我自己都有点头大了……
总而言之,void和void*蕴含了丰富哲理啊~我觉得这是C和C++的艺术。
谁有兴趣的话可以总结总结void**和void*** ……或者void**************
哈哈。可以作为一个哲学课题了。
分享到:
相关推荐
Coding Theory The Essentials
《SAP方丈-Coding Block详解》 在IT领域,SAP系统是企业资源规划(ERP)软件的领导者,广泛应用于全球各地的企业中。而Coding Block则是SAP ABAP编程中的一项重要概念,它对于理解SAP编程逻辑、提高代码效率和可...
在IT领域,编码是软件开发过程中的核心环节,而"Phase Coding",或者称为"阶段编码",是指在软件开发生命周期中特定阶段进行的编码活动。这一阶段通常发生在需求分析、设计和规划之后,是将设计方案转化为可执行程序...
【Coding4Fun控件】是专门为Windows Phone平台开发的一系列扩展控件库,它为开发者提供了许多超越原生Windows Phone SDK的功能和视觉效果,旨在增强应用程序的用户体验和交互性。这个库是由微软开发者社区成员创建并...
OpenCores是一个开源硬件项目社区,其提供的`opencores_coding_guidelines.pdf`文档详细介绍了针对VHDL和Verilog的编码规范。这些指导原则旨在确保代码的一致性和可读性,包括但不限于变量命名规则、注释标准、模块...
Each chapter in Coding Games in Python shows how to construct a complete working game in simple numbered steps. The book teaches how to use freely available resources, such as PyGame Zero and Blender,...
这个名为"zencoding小工具"的压缩包文件显然是Zen Coding的一个实现或者扩展,旨在帮助用户快速、便捷地编写代码。下面将详细介绍Zen Coding的核心概念以及如何利用它来提高开发效率。 Zen Coding最初由Dmitry ...
"zencoding-vim" 是一个专为Vim编辑器设计的插件,它引入了Zen Coding的概念,大大提升了前端开发者的工作效率。Zen Coding,后来更名为Emmet,是前端开发领域中一个快速编写HTML和CSS的工具。这个插件将Emmet的功能...
1. **快速创建元素**: ZenCoding允许你输入简短的缩写,如`div>ul>li*3`,它会自动生成如下代码: ``` <li></li> <li></li> <li></li> ``` 2. **嵌套元素**: 通过缩进或使用`>`符号,可以轻松创建嵌套...
Alibaba Java Coding Guidelines IDEA插件正是基于这套规范打造的,它集成于IntelliJ IDEA这款强大的Java开发环境之中。安装插件后,IDEA可以在编码过程中实时进行错误和警告提示,帮助开发者及时发现并修正不符合...
这个名为"ZenCoding.zip"的压缩包包含了ZenCoding的核心组件和相关资源,便于用户安装和使用。 ZenCoding的核心功能在于其强大的代码缩写和扩展能力。它允许开发者使用简短的缩写来快速生成复杂的HTML结构,例如...
在压缩包文件名列表中提到的"zen coding"可能是Zen Coding的安装包或资源文件。安装这个插件后,用户可以享受到Zen Coding提供的各种便捷功能,从而提升编程体验。总的来说,Zen Coding(Emmet)是前端开发者不可或...
coding coding (encrypted) coding coding (encrypted) coding coding (encrypted) coding coding (encrypted) coding coding (encrypted) coding coding (encrypted)
Contrastive Multiview Coding笔记 Contrastive Multiview Coding是一种多视图对比学习方法,旨在学习鲁棒、通用的表示形式,该表示形式可以从多个视图中学习到共享的因素,例如物理、几何、语义等。该方法可以扩展...
Git和Coding是现代软件开发中不可或缺的工具,用于版本控制和协作。Git是一个分布式版本控制系统,而Coding则是一个集成了代码托管、项目管理、质量管理等功能的云端开发平台。本资源旨在帮助用户熟悉如何安装Git,...
这份"ZenCoding中文参考手册"PDF版提供了全面的使用方法和技巧,对于熟悉和掌握这一工具至关重要。 1. **ZenCoding的基本概念**: ZenCoding的核心理念是利用简短的代码片段(称为 Abbreviations)来生成长长的...
《Grokking the Coding Interview - Patterns for Coding Questions》是一份专为北美算法面试准备的压缩包资源,其中包含了多种常见的编程题目模式。这份资源旨在帮助面试者熟练掌握各种算法和数据结构,以便在面试...
Range Coding 是一种无损数据压缩算法,主要用于编码连续的概率分布。在D语言中实现Range Coding,我们可以深入了解D语言的基础语法、内存管理以及算法设计。以下是对这个话题的详细阐述。 一、Range Coding 算法...
Using fun graphics and easy-to-follow instructions, Coding Projects in Python is a straightforward, visual guide that shows young learners how to build their own computer projects using Python, an ...