`
rcfalcon
  • 浏览: 228588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

大话C、C++之 关于void的一点哲学思考

 
阅读更多

从今天开始本菜鸟将就编程里我遇到的一些有意思的东西写点点看法~

取名叫“大话C、C++” 系列吧

早就想自己总结一下关于C、C++里一点关于void的思考了。发现几个非常有意思的地方。

void在C、C++里的意思是“空”。最常用的是,当一个函数不需要返回值的时候,就给它的返回值定义成void。或者一个函数不需要输入参数的时候,也将其定义为void。

“空”,无论是在自然界还是在我们的哲学界都是一个很宽泛的概念。

记得小学的时候,自然数是不包括零的。而不知道从什么时候开始,(貌似是初中),老师又说我们的自然数应该是包括零——因为“无”的概念在自然界中也是天然存在的。可见学术界就关于“空”和 “无”的概念也是模拟两可,争论不断的。

读书前的我们,最自然、感性的理解,“无”就是没有,那么我们就不要去管。

而当我们到小学或者初中的时候,老师反复强调,在理性的范畴内,零这个东西是由意义的。是一个值,一个有意义的载体,而不是一个空洞的不需要理会的东东。

那么在编程里面,我们可以看到

void f( void ) 函数可以简单的写成 f()

又是一个可以“忽略”的东西。

所以,即使在理性的范畴,空 和 无的概念,需要具体按情况来定。

然后我们再看看感性的认识:

佛门经典语句,“色即是空”。

哈哈,用的思想来理解这个是彻底的唯心主义了 —— 世间万物形形色色,而在心中这一切对老子心中就如同没有一样。

好了,这个问题交给哲学家。下面来讨论一下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**************

哈哈。可以作为一个哲学课题了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics