關鍵在理論,而理論的基礎在“模型”,也叫“假說”,任何學科都一樣。
比如數組。在C語言中,數組屬於一種叫“內置數組”的概念,在模型上,是一列火車,每節車廂就是數組的一個元素。內置數組有兩個基本點,第一是每個元素都是相同的數據類型,第二元素都是緊密相鄰的(非緊密相鄰的則是所謂的鏈表)。數組的長度,在數組建立時就固定下來了,猶如火車的車廂數,上路後就不可能再變動了。如果要增減數組元素的個數,是不能簡單地加掛和砍除的,因為火車在路上,前後都可能已經有別的車輛在運行,未必有空間讓你隨便加掛車廂。因此,要改變數組的長度,正常的做法是尋找足夠大小的新空間,然後把原來的東西搬過去,再在剩餘的空間上分配新的內容,顯得數組的尺寸改變了——因此,realloc()之類函數的結果,是數組的入口地址可能會改變。如果不明白這個模型,可能就完全不知道這樣做的危險性在哪裡,甚至無法理解realloc()會改變數組地址的事實,更別說使用之後要整理所有涉及的指針了。然而,一旦你明白這個模型,那麼在編程時,很自然就能想到有可能發生問題,從而預先測試、試探、證實設計的方案。這些東西,是僅僅學習具體使用技術無法教會你的,那樣只能是教一招懂一招,不知其所以然,終究還是被動。
再如指針,那其實就等於是一道光線,指向某個目標而已。聲明一個指針,只是宣佈有這麼一道光線將會投入使用,但它具體指向哪裡,要靠初始化和賦值來確定,對象消失了,光線儘管仍然指向原來的位置,但已不可能再假定原來的殘骸仍在,這個地方可能已經被操作系統安排了其他的東西進去,這樣指針就成了野指針。同樣,可以有多道光線指向同一位置,但只要這個位置的對象消失,那麼這些指針就同時失去目標,C指針程序員的麻煩,是難以記憶自己使用了多少指針指向這個位置。須知,對象沒有了,但指針仍在,在這個函數釋放了的對象,在別的函數未必知道,但又用了指向它的指針。也就是說,如果你明白這些道理,那麼以後編程時,該注意什麼問題,自己心中有數了。
書本可以教你這些道理,但沒有教你具體在一個程序中如何規劃整個佈局,這首先要靠經驗,其次要在看語法書之外,再看一些軟件工程的理論。光寫代碼是不夠的。