用人類社會工程學對C語言中的一些基本概念的剖析與理解
最近在學C語言程式設計時總是遇到一些概念理解上的不清晰與混亂的地方,在一次偶然間想到了以前看過的一部電影《我是誰,沒有一個系統是安全的》,裡面的主角用社會工程學的想法結合黑客知識化險為夷,給予了很大的震撼與啟發。所以我想如果將現實中C語言的一些概念和人類社會聯絡起來,會不會產生一些奇妙的結果。
首先我們應該先從C語言中最基本的概念開始(如果能將C語言中的基本概念與人類社會中的一些基本的概念聯絡起來的話,根據圖靈計算的原理,那麼我的這種想法很有可能也行得通),如果將變數與常量比作住在房子裡的人的話,那麼地址就可以認為是那個人(常量或變數)所住的房子的門牌號,每一個人(變數與常量)都有一個屬於自己的門牌號(地址)。指標就可以理解為一個指路牌,指路牌上有門牌號(地址),通過這個門牌號可以找到住在這個房子裡的人。與現實世界不同的是,計算機中的世界上是一維的,也就是說,我們(使用者)通過門牌號(地址)就可以準確無誤的找到我們要找的那個人(變數或常量)。這就是我們說為什麼指標是C語言中最重要的概念的原因(如果你還不明白,可以自己去百度一下圖靈機)。還有一個基本概念就是記憶體,我們可以將它類比成房產局,只有向房產局(記憶體)申請才能獲得住在房子(地址)裡的權力
有了以上的概念,那麼我們就可以定義一些相對複雜的東西,例如陣列,我們知道陣列是由許多單一資料型別組成的集合,那麼我們就可以將它類比成一個小區,小區裡由若干個人(變數),而且門牌號(地址)都按一定的規則排放。特別的,我們知道陣列一般在程式中除了初始化外很難直接被整體改變,我們可以理解為一個小區(陣列)中的人(變數)太多,當你要對它進行改變時過於麻煩,而若只改變指路牌(指標),那麼工作量就會小很多。類似的,對函式我們可以認為它是一個公司,裡面有許多不同型別的人(變數)各司其職,通過一些工具(C語言中的基礎語句,如if語句,以及庫函式)來實現使用者的目的。同樣,我們可以將結構體看作一個街道,一個街道可能包括一些個體戶(變數),一些小區(陣列),甚至公司(函式),不過公司(函式)太過龐大,沒法全部過來,只能將門牌號(地址)掛在這裡,通過指路牌(指標)可以找到它。與現實中的公司類似,如果一個公司(函式)十分龐大,甚至會包含一個或幾個街道,這時,如果函式想要使用結構體,只需知道結構體的變數名以及其中的成員名即可。值得注意的是,如果你在宣告結構體時只聲明瞭結構體名,那麼記憶體是不會分配記憶體空間的,可以理解為,你只想房產局(記憶體)提出了想建立一個街道(結構體)的申請,但是並沒有告訴房產局(記憶體)你的街道(結構體)叫什麼名字,所以房產局(記憶體)自然不可能給你分配房子(地址)。在結構體變數作函式引數時,也需要同時宣告結構體名與變數名。
對程式而言,呼叫變數有兩種方法,一種是根據變數名直接呼叫,一種是根據變數呼叫。對此,我們可以理解為當程式編譯時,房產局(記憶體)以經記錄了每一個人(變數)的門牌號(地址),當我們要求呼叫某個人(變數)時,可以直接挨家挨戶去找,也可以去房產局(記憶體)要一個指向他家指路牌(指標),毫無疑問,第二種做法跟有效率一些。
通過人類社會工程學,我們可以更好的理解C語言中的一些概念,可以降低初學者的難度,同時也可以反窺C語言的創造者們在編寫C語言時的邏輯歷程,這對我們以後進行工程作業時可以有更多的啟發。本文只是通過人類社會工程學對C語言進行了一個粗糙的刨析,事實上,我們可以基於此對C語言中的一些更加具體的操作進行分析與類比,甚至可以對記憶體中的儲存區進行分析與說明。
另,鑑於本人見識所限,文中如有與事實不符之處,還望指出,萬分感謝。
2019年2月17日