最近在学C语言程序设计时总是遇到一些概念理解上的不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影《我是谁,没有一个系统是安全的》,里面的主角用社会工程学的想法结合黑客知识化险为夷,给予了很大的震撼与启发。所以我想如果将现实中C语言的一些概念和人类社会联系起来,会不会产生一些奇妙的结果。
首先我们应该先从C语言中最基本的概念开始(如果能将C语言中的基本概念与人类社会中的一些基本的概念联系起来的话,根据图灵计算的原理,那么我的这种想法很有可能也行得通),如果将变量与常量比作住在房子里的人的话,那么地址就可以认为是那个人(常量或变量)所住的房子的门牌号,每一个人(变量与常量)都有一个属于自己的门牌号(地址)。指针就可以理解为一个指路牌,指路牌上有门牌号(地址),通过这个门牌号可以找到住在这个房子里的人。与现实世界不同的是,计算机中的世界上是一维的,也就是说,我们(用户)通过门牌号(地址)就可以准确无误的找到我们要找的那个人(变量或常量)。这就是我们说为什么指针是C语言中最重要的概念的原因(如果你还不明白,可以自己去百度一下图灵机)。还有一个基本概念就是内存,我们可以将它类比成房产局,只有向房产局(内存)申请才能获得住在房子(地址)里的权力
有了以上的概念,那么我们就可以定义一些相对复杂的东西,例如数组,我们知道数组是由许多单一数据类型组成的集合,那么我们就可以将它类比成一个小区,小区里由若干个人(变量),而且门牌号(地址)都按一定的规则排放。特别的,我们知道数组一般在程序中除了初始化外很难直接被整体改变,我们可以理解为一个小区(数组)中的人(变量)太多,当你要对它进行改变时过于麻烦,而若只改变指路牌(指针),那么工作量就会小很多。类似的,对函数我们可以认为它是一个公司,里面有许多不同类型的人(变量)各司其职,通过一些工具(C语言中的基础语句,如if语句,以及库函数)来实现用户的目的。同样,我们可以将结构体看作一个街道,一个街道可能包括一些个体户(变量),一些小区(数组),甚至公司(函数),不过公司(函数)太过庞大,没法全部过来,只能将门牌号(地址)挂在这里,通过指路牌(指针)可以找到它。与现实中的公司类似,如果一个公司(函数)十分庞大,甚至会包含一个或几个街道,这时,如果函数想要使用结构体,只需知道结构体的变量名以及其中的成员名即可。值得注意的是,如果你在声明结构体时只声明了结构体名,那么内存是不会分配内存空间的,可以理解为,你只想房产局(内存)提出了想建立一个街道(结构体)的申请,但是并没有告诉房产局(内存)你的街道(结构体)叫什么名字,所以房产局(内存)自然不可能给你分配房子(地址)。在结构体变量作函数参数时,也需要同时声明结构体名与变量名。
对程序而言,调用变量有两种方法,一种是根据变量名直接调用,一种是根据变量调用。对此,我们可以理解为当程序编译时,房产局(内存)以经记录了每一个人(变量)的门牌号(地址),当我们要求调用某个人(变量)时,可以直接挨家挨户去找,也可以去房产局(内存)要一个指向他家指路牌(指针),毫无疑问,第二种做法跟有效率一些。
通过人类社会工程学,我们可以更好的理解C语言中的一些概念,可以降低初学者的难度,同时也可以反窥C语言的创造者们在编写C语言时的逻辑历程,这对我们以后进行工程作业时可以有更多的启发。本文只是通过人类社会工程学对C语言进行了一个粗糙的刨析,事实上,我们可以基于此对C语言中的一些更加具体的操作进行分析与类比,甚至可以对内存中的储存区进行分析与说明。
另,鉴于本人见识所限,文中如有与事实不符之处,还望指出,万分感谢。
2019年2月17日