數(shù)組在所有的語言中,以C最為簡單,就是一起始地址,外加一數(shù)組的長度,而且基本上沒有任何功能可言。然而,在所有的數(shù)組使用中,卻是C的這種簡單的數(shù)組形式,最一再使我心折,其靈活性和效率,簡直驚天地泣鬼神,前無古人,后無來者,念天地之悠悠,高處不勝寒。首先,C數(shù)組從邏輯上講,是分形一致的(想不到其他詞來形容了),分形的意思,就是部分與整體保持一致的構(gòu)造形式,也即是數(shù)組的任何一部分也都是數(shù)組,比如一整型數(shù)組{1,2,3,4,5},連續(xù)取出其中任一連續(xù)的部分,都可以看成是一個(gè)數(shù)組,{2,3}是數(shù)組,{1,2,3}是數(shù)組,{4,5}也都是數(shù)組,差別只在于數(shù)組的起始地址和元素的個(gè)數(shù)。那怕是數(shù)組中的任何一個(gè)元素,都可以看成是一個(gè)長度為1的數(shù)組。因此,C數(shù)組的這種統(tǒng)一的格式,在作為參數(shù),傳遞給函數(shù)的時(shí)候,特別是遞歸函數(shù)中,不知道有多么方便。 比如冒泡排序,BubbleSort(int* pInt, int nLen),用遞歸來實(shí)現(xiàn),只要冒完第1個(gè)元素之后,接著就可以遞歸,內(nèi)部調(diào)用自己,BubbleSort(pInt+1, nLen-1),繼續(xù)冒泡數(shù)組,只是數(shù)組是由第1個(gè)數(shù)之后的全部數(shù)組成的新的數(shù)組,元素個(gè)數(shù)比之前少1,一直如是處理,直到最后,數(shù)組的長度為1,于是冒泡排序完成。這種方法的成立前提,就在于C數(shù)組格式的高度統(tǒng)一。一個(gè)操作數(shù)組的函數(shù),可以操作數(shù)組的任何一部分,甚至可以操作一個(gè)變量,因?yàn)閱为?dú)的變量可以看成是元素長度為1的數(shù)組,多少次,我們用WideCharToMultiByte來轉(zhuǎn)換一個(gè)寬字符變量。C語言中操作數(shù)組的函數(shù),搭配上C數(shù)組的簡單定義,其應(yīng)用,那是相當(dāng)相當(dāng)廣泛的,并且使用起來,自然非常非常的方便,比如剛才的冒泡函數(shù)BubbleSort,只要你高興,完全可以拿來只冒數(shù)組中的隨便某一部分,這完全可以由用戶自己隨意定制,語言層面上直接支持了。 其他語言的數(shù)組,由于特點(diǎn)很多,反而失去了這種邏輯意義上的統(tǒng)一處理,因?yàn)樵谒鼈兡抢铮瑪?shù)組的任何一部分都不能看成數(shù)組,單獨(dú)的變量也沒法看成是數(shù)組,在它們世界,數(shù)組與獨(dú)立變量,無論如何,都沒法劃上等號(hào)。如果他們要用遞歸實(shí)現(xiàn)冒泡排序的代碼,形式上無論如何都比不上我們的C數(shù)組形式的函數(shù),誰說C的代碼就意味著代碼量多了,用得好,可以簡單得讓人贊嘆不已。 我們?cè)賮砜纯碈的字符串,也很簡單,它也是一個(gè)數(shù)組,只不過最后一個(gè)元素是’\nul’,加了這么一點(diǎn)限制之后,字符串自然就失去了數(shù)組的分形強(qiáng)悍,但C的字符串依然不可小看,因?yàn)樽址校灰獛狭?#8217;\nul’,都能看成是字符串,好比,”hello”這條字符串,只要改變起始地址,就可輕而易舉地得到”ello”,”llo”,”lo”,”o”這好幾條子字符串,這個(gè)特點(diǎn),可以簡化很多字符串操作,并且效率最高。此外,C字符串,只要你愿意,完成可以拿來當(dāng)成是字符數(shù)組來使用,這樣,就又恢復(fù)了數(shù)組分形功能,C函數(shù)庫中和WINDOWS API,有很多函數(shù)就是專門處理C字符數(shù)組的。
C數(shù)組的這種分形特性,在STL被抽象成迭代器,于是,在C++中,就失去了原有的輝煌。但是,在很多簡單的設(shè)計(jì)中,依然有著不可低估的力量。
C的很多東西,就是這樣,因?yàn)楹唵危詮?qiáng)大得令人心寒。函數(shù)、結(jié)構(gòu)體、數(shù)組、GOTO、枚舉這些簡單的東西,巧妙的配合使用,可以玩出很多很多意想不到的神奇功能出來,令人擊節(jié)贊嘆,而且不會(huì)像C++那樣,存在著所謂的什么心智負(fù)擔(dān)。此外,C中的宏,嘿嘿,俺就不提了,變化多端,鬼神莫測(cè)。對(duì)于C,我越來越敬畏,它遠(yuǎn)遠(yuǎn)不似表面上看的那么簡單,其背后自然潛藏著一套精神規(guī)則。即使看到每一行C代碼,內(nèi)心都能知道它的相應(yīng)的匯編代碼,那又怎么樣,它總是有辦法讓你驚喜不已。