huaxiazhihuo

 

神奇的C数组

         数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言。然而,在所有的数组使用中,却是C的这种简单的数组形式,最一再使我心折,其灵活性和效率,简直惊天地泣鬼神,前无古人,后无来者,念天地之悠悠,高处不胜寒。
首先,C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个数。那怕是数组中的任何一个元素,都可以看成是一个长度为1的数组。因此,C数组的这种统一的格式,在作为参数,传递给函数的时候,特别是递归函数中,不知道有多么方便。
         比如冒泡排序,BubbleSort(int* pInt, int nLen),用递归来实现,只要冒完第1个元素之后,接着就可以递归,内部调用自己,BubbleSort(pInt+1, nLen-1),继续冒泡数组,只是数组是由第1个数之后的全部数组成的新的数组,元素个数比之前少1,一直如是处理,直到最后,数组的长度为1,于是冒泡排序完成。这种方法的成立前提,就在于C数组格式的高度统一。一个操作数组的函数,可以操作数组的任何一部分,甚至可以操作一个变量,因为单独的变量可以看成是元素长度为1的数组,多少次,我们用WideCharToMultiByte来转换一个宽字符变量。C语言中操作数组的函数,搭配上C数组的简单定义,其应用,那是相当相当广泛的,并且使用起来,自然非常非常的方便,比如刚才的冒泡函数BubbleSort,只要你高兴,完全可以拿来只冒数组中的随便某一部分,这完全可以由用户自己随意定制,语言层面上直接支持了。
         其他语言的数组,由于特点很多,反而失去了这种逻辑意义上的统一处理,因为在它们那里,数组的任何一部分都不能看成数组,单独的变量也没法看成是数组,在它们世界,数组与独立变量,无论如何,都没法划上等号。如果他们要用递归实现冒泡排序的代码,形式上无论如何都比不上我们的C数组形式的函数,谁说C的代码就意味着代码量多了,用得好,可以简单得让人赞叹不已。
         我们再来看看C的字符串,也很简单,它也是一个数组,只不过最后一个元素是’\nul’,加了这么一点限制之后,字符串自然就失去了数组的分形强悍,但C的字符串依然不可小看,因为字符串中,只要带上了’\nul’,都能看成是字符串,好比,”hello”这条字符串,只要改变起始地址,就可轻而易举地得到”ello”,”llo”,”lo”,”o”这好几条子字符串,这个特点,可以简化很多字符串操作,并且效率最高。此外,C字符串,只要你愿意,完成可以拿来当成是字符数组来使用,这样,就又恢复了数组分形功能,C函数库中和WINDOWS API,有很多函数就是专门处理C字符数组的。

        C数组的这种分形特性,在STL被抽象成迭代器,于是,在C++中,就失去了原有的辉煌。但是,在很多简单的设计中,依然有着不可低估的力量。

        C的很多东西,就是这样,因为简单,所以强大得令人心寒。函数、结构体、数组、GOTO、枚举这些简单的东西,巧妙的配合使用,可以玩出很多很多意想不到的神奇功能出来,令人击节赞叹,而且不会像C++那样,存在着所谓的什么心智负担。此外,C中的宏,嘿嘿,俺就不提了,变化多端,鬼神莫测。对于C,我越来越敬畏,它远远不似表面上看的那么简单,其背后自然潜藏着一套精神规则。即使看到每一行C代码,内心都能知道它的相应的汇编代码,那又怎么样,它总是有办法让你惊喜不已。

posted on 2012-06-01 16:32 华夏之火 阅读(2184) 评论(12)  编辑 收藏 引用

评论

# re: 神奇的C数组[未登录] 2012-06-01 18:07 春秋十二月

字符串怎么失去了所谓的分形特性?数组,除了内存是连续存储的,还有什么神奇的呢  回复  更多评论   

# re: 神奇的C数组 2012-06-01 18:24 华夏之火

确实,C语言的数组就是内存连续的东西,内存连续就可以看成是数组@春秋十二月
  回复  更多评论   

# re: 神奇的C数组 2012-06-01 21:42 空明流转

整体上来说,你就是个C控。  回复  更多评论   

# re: 神奇的C数组 2012-06-01 21:43 泡菜

C++中STL的排序默认是快速排序算法,在大多数时候效率高的惊人!大多数大牛在这个方面都不敢冒泡的!你真觉得自己有那么牛X????

另,C不进行边界检查的!这会带来一系列的安全问题!!!!听说过栈溢出木?
STL在安全/性能方面有很均衡的考虑滴。。。:)  回复  更多评论   

# re: 神奇的C数组 2012-06-01 21:45 空明流转

另外,你扯得这些都是Bullshit。
链表的一部分不是链表?
树的一部分不是树?
字典的一部分不是字典?
集合的一部分不是集合?  回复  更多评论   

# re: 神奇的C数组 2012-06-01 22:35 华夏之火

我是C++迷,只是渐渐觉得之前忽略了太多c简单的威力,却沉迷于C++的复杂。另外,c数组由语言层直接支持,使用频率也远大于链表等东西。并且链表这些东西的一部分,自然也都看成链表等,但那只是概念上的看法,实际编程中谁会拿链表的一部分进行这样使用的。@空明流转
  回复  更多评论   

# re: 神奇的C数组 2012-06-01 22:38 泡菜

小伙!有挑战经典,质疑权威的勇气是可嘉的,现在不少人缺这个,可。。。也不能乱挑战啊。。。呵呵

STL实际上是三部分,包括算法\迭代器\容器,你所说的冒泡算法,包括别的算法,你要是乐意,一样能用到STL上的

小伙!不可否认,C是很伟大的东西,但按照你这篇博文的表述,。。。给搞变味了。。。  回复  更多评论   

# re: 神奇的C数组 2012-06-01 22:58 华夏之火

我那样写只是比喻而已,实际编程中,我们很少需要写排序的代码@泡菜
  回复  更多评论   

# re: 神奇的C数组 2012-06-01 23:08 华夏之火

先生要是觉得在下那样写变味了,那就算变味吧,在下只是表达自己对c数组的一点理解,旨在抛砖引玉,这不,就引来了您老人家的两块大玉了@泡菜
  回复  更多评论   

# re: 神奇的C数组[未登录] 2012-06-02 07:01 qq

顶楼主。cppblog好久不活跃了 n久没看到有这么多回帖的文章了  回复  更多评论   

# re: 神奇的C数组[未登录] 2012-06-03 01:55 空明流转

@华夏之火
难道你都不递归不迭代吗。逻辑上是部分,物理上也是部分。  回复  更多评论   

# re: 神奇的C数组 2012-06-05 21:14 NaN

”强大得令人心寒“,怎么心寒了?  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜