最近在学C语言程序设计时总是遇到一些概念理解上的不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影《我是谁,没有一个系统是安全的》,里面的主角用社会工程学的想法结合黑客知识化险为夷,给予了很大的震撼与启发。所以我想如果将现实中C语言的一些概念和人类社会联系起来,会不会产生一些奇妙的结果。

  首先我们应该先从C语言中最基本的概念开始(如果能将C语言中的基本概念与人类社会中的一些基本的概念联系起来的话,根据图灵计算的原理,那么我的这种想法很有可能也行得通),如果将变量与常量比作住在房子里的人的话,那么地址就可以认为是那个人(常量或变量)所住的房子的门牌号,每一个人(变量与常量)都有一个属于自己的门牌号(地址)。指针就可以理解为一个指路牌,指路牌上有门牌号(地址),通过这个门牌号可以找到住在这个房子里的人。与现实世界不同的是,计算机中的世界上是一维的,也就是说,我们(用户)通过门牌号(地址)就可以准确无误的找到我们要找的那个人(变量或常量)。这就是我们说为什么指针是C语言中最重要的概念的原因(如果你还不明白,可以自己去百度一下图灵机)。还有一个基本概念就是内存,我们可以将它类比成房产局,只有向房产局(内存)申请才能获得住在房子(地址)里的权力

  有了以上的概念,那么我们就可以定义一些相对复杂的东西,例如数组,我们知道数组是由许多单一数据类型组成的集合,那么我们就可以将它类比成一个小区,小区里由若干个人(变量),而且门牌号(地址)都按一定的规则排放。特别的,我们知道数组一般在程序中除了初始化外很难直接被整体改变,我们可以理解为一个小区(数组)中的人(变量)太多,当你要对它进行改变时过于麻烦,而若只改变指路牌(指针),那么工作量就会小很多。类似的,对函数我们可以认为它是一个公司,里面有许多不同类型的人(变量)各司其职,通过一些工具(C语言中的基础语句,如if语句,以及库函数)来实现用户的目的。同样,我们可以将结构体看作一个街道,一个街道可能包括一些个体户(变量),一些小区(数组),甚至公司(函数),不过公司(函数)太过庞大,没法全部过来,只能将门牌号(地址)挂在这里,通过指路牌(指针)可以找到它。与现实中的公司类似,如果一个公司(函数)十分庞大,甚至会包含一个或几个街道,这时,如果函数想要使用结构体,只需知道结构体的变量名以及其中的成员名即可。值得注意的是,如果你在声明结构体时只声明了结构体名,那么内存是不会分配内存空间的,可以理解为,你只想房产局(内存)提出了想建立一个街道(结构体)的申请,但是并没有告诉房产局(内存)你的街道(结构体)叫什么名字,所以房产局(内存)自然不可能给你分配房子(地址)。在结构体变量作函数参数时,也需要同时声明结构体名与变量名。

  对程序而言,调用变量有两种方法,一种是根据变量名直接调用,一种是根据变量调用。对此,我们可以理解为当程序编译时,房产局(内存)以经记录了每一个人(变量)的门牌号(地址),当我们要求调用某个人(变量)时,可以直接挨家挨户去找,也可以去房产局(内存)要一个指向他家指路牌(指针),毫无疑问,第二种做法跟有效率一些。

  通过人类社会工程学,我们可以更好的理解C语言中的一些概念,可以降低初学者的难度,同时也可以反窥C语言的创造者们在编写C语言时的逻辑历程,这对我们以后进行工程作业时可以有更多的启发。本文只是通过人类社会工程学对C语言进行了一个粗糙的刨析,事实上,我们可以基于此对C语言中的一些更加具体的操作进行分析与类比,甚至可以对内存中的储存区进行分析与说明。

  另,鉴于本人见识所限,文中如有与事实不符之处,还望指出,万分感谢。

2019年2月17日

用人类社会工程学对C语言中的一些基本概念的剖析与理解的更多相关文章

  1. C语言中关键字restrict的概念,使用范围,例子

    概念: restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容. 渊源: res ...

  2. C语言中对文件的读写的一些浅显理解

    前述:基于上学期完成的数据结构的课程设计,对于老师的提出要求实现的基础上,自己在使用过程中发现每次打开程序都需要重新输入数据,于是便决定,将文件读写功能加入此次课程设计中,以下是我的一些心得和浅显理解 ...

  3. C语言中数据类型取值范围的计算的理解与总结

    c语言中,数据类型有short,int,long,char,float,double,然后除了浮点型只有 有符号数(signed)外,其他的数据类型都分为有符号(signed)和无符号(unsigne ...

  4. C#语言中字段和属性相关知识剖析

    针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...

  5. c语言中静态区,栈,堆的理解

    对于程序员,一般来说,我们可以简单的理解为内存分为三个部分:静态区,栈,堆. 很多书没有把把堆和栈解释清楚,导致初学者总是分不清楚. 其实堆栈就是栈,而不是堆. 堆的英文是heap:栈的英文是stac ...

  6. c语言中指向整型指针的指针的理解

    /************************************************************************* > File Name: ptr_ptr_i ...

  7. Kali-linux使用社会工程学工具包(SET)

    社会工程学工具包(SET)是一个开源的.Python驱动的社会工程学渗透测试工具.这套工具包由David Kenned设计,而且已经成为业界部署实施社会工程学攻击的标准.SET利用人们的好奇心.信任. ...

  8. MetaSploit攻击实例讲解------社会工程学set攻击(kali linux 2016.2(rolling))(详细)

    不多说,直接上干货! 首先,如果你是用的BT5,则set的配置文件是在 /pentest/exploits/set/set_config下. APACHE_SERVER=ONSELF_SIGNED_A ...

  9. 策略设计模式与c语言中的函数指针

    在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...

随机推荐

  1. javascript ES6 新特性之 let

    let的作用是声明变量,和var差不多. let是ES6提出的,在了解let之前,最好先熟悉var的原理. JavaScript有一个机制叫“预解析”,也可以叫“提升(Hoisting)机制”.很多刚 ...

  2. WebSocket(4)---实现定时推送比特币交易信息

    实现定时推送比特币交易信息 实现功能:跟虚拟币交易所一样,时时更新当前比特币的价格,最高价,最低价,买一价等等...... 提示:(1)本篇博客是在上一遍基础上搭建,上一篇博客地址:[WebSocke ...

  3. (五)通过Python的select监控多个描述符实现并发连接

    概述 本文通过使用select改写之前的服务器程序通过监控多个套接字描述符来实现并发连接并加入了一些机制让程序更加健壮,不过我们所有的实验都是建立在单词发送数据不会超过1024字节,如果超过你需要做特 ...

  4. RabbitMQ消息队列(十三)-VirtualHost与权限管理

    像mysql有数据库的概念并且可以指定用户对库和表等操作的权限.那RabbitMQ呢?RabbitMQ也有类似的权限管理.在RabbitMQ中可以虚拟消息服务器VirtualHost,每个Virtua ...

  5. Linux下 Vim(Vi)编辑器的使用

    vi编辑器 vi是UNIX和类UNIX环境下的可用于创建文件的屏幕编辑器.vi有两种工作模式:命令模式和文本输入模式.启动vi需要输入vi,按[Spacebar]键并输入文件名后回车. 切换模式键 v ...

  6. shell初识

    今天写blog才发现以前还有没写起的,我的天,我是睡着了么... 1,什么是shell? shell是unix/Linux系统的一个用充当内核与用户之间的接口的软件,它读取用户的输入命令,发送给内核让 ...

  7. RDIFramework.NET平台代码生成器V3.2版本全新发布(提供下载-免费使用)

    回顾V3.1版本更新内容如下: 1.增加对Oracle表创建语句的查看. 2.新增对MySql的代码生成支持. 3.全面重构对多线程的支持,改变以前会无故退出的现象. 本次在V3.1版本的基础上,增加 ...

  8. JDBC与ORM发展与联系 JDBC简介(九)

    概念回顾 回顾下JDBC的概念: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它 ...

  9. Mybatis源码之StatementType

      在mybatis中StatementType的值决定了由什么对象来执行我们的SQL语句.本文来分析下在mybatis中具体是怎么处理的. StatementType 1.StatementType ...

  10. asp.net MVC NPOI导出excel通用

    一.创建一个类文件添加 public class ExportToExcelColumn { public ExportToExcelColumn(string _Columnnames, strin ...