用人类社会工程学对C语言中的一些基本概念的剖析与理解
最近在学C语言程序设计时总是遇到一些概念理解上的不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影《我是谁,没有一个系统是安全的》,里面的主角用社会工程学的想法结合黑客知识化险为夷,给予了很大的震撼与启发。所以我想如果将现实中C语言的一些概念和人类社会联系起来,会不会产生一些奇妙的结果。
首先我们应该先从C语言中最基本的概念开始(如果能将C语言中的基本概念与人类社会中的一些基本的概念联系起来的话,根据图灵计算的原理,那么我的这种想法很有可能也行得通),如果将变量与常量比作住在房子里的人的话,那么地址就可以认为是那个人(常量或变量)所住的房子的门牌号,每一个人(变量与常量)都有一个属于自己的门牌号(地址)。指针就可以理解为一个指路牌,指路牌上有门牌号(地址),通过这个门牌号可以找到住在这个房子里的人。与现实世界不同的是,计算机中的世界上是一维的,也就是说,我们(用户)通过门牌号(地址)就可以准确无误的找到我们要找的那个人(变量或常量)。这就是我们说为什么指针是C语言中最重要的概念的原因(如果你还不明白,可以自己去百度一下图灵机)。还有一个基本概念就是内存,我们可以将它类比成房产局,只有向房产局(内存)申请才能获得住在房子(地址)里的权力
有了以上的概念,那么我们就可以定义一些相对复杂的东西,例如数组,我们知道数组是由许多单一数据类型组成的集合,那么我们就可以将它类比成一个小区,小区里由若干个人(变量),而且门牌号(地址)都按一定的规则排放。特别的,我们知道数组一般在程序中除了初始化外很难直接被整体改变,我们可以理解为一个小区(数组)中的人(变量)太多,当你要对它进行改变时过于麻烦,而若只改变指路牌(指针),那么工作量就会小很多。类似的,对函数我们可以认为它是一个公司,里面有许多不同类型的人(变量)各司其职,通过一些工具(C语言中的基础语句,如if语句,以及库函数)来实现用户的目的。同样,我们可以将结构体看作一个街道,一个街道可能包括一些个体户(变量),一些小区(数组),甚至公司(函数),不过公司(函数)太过庞大,没法全部过来,只能将门牌号(地址)挂在这里,通过指路牌(指针)可以找到它。与现实中的公司类似,如果一个公司(函数)十分庞大,甚至会包含一个或几个街道,这时,如果函数想要使用结构体,只需知道结构体的变量名以及其中的成员名即可。值得注意的是,如果你在声明结构体时只声明了结构体名,那么内存是不会分配内存空间的,可以理解为,你只想房产局(内存)提出了想建立一个街道(结构体)的申请,但是并没有告诉房产局(内存)你的街道(结构体)叫什么名字,所以房产局(内存)自然不可能给你分配房子(地址)。在结构体变量作函数参数时,也需要同时声明结构体名与变量名。
对程序而言,调用变量有两种方法,一种是根据变量名直接调用,一种是根据变量调用。对此,我们可以理解为当程序编译时,房产局(内存)以经记录了每一个人(变量)的门牌号(地址),当我们要求调用某个人(变量)时,可以直接挨家挨户去找,也可以去房产局(内存)要一个指向他家指路牌(指针),毫无疑问,第二种做法跟有效率一些。
通过人类社会工程学,我们可以更好的理解C语言中的一些概念,可以降低初学者的难度,同时也可以反窥C语言的创造者们在编写C语言时的逻辑历程,这对我们以后进行工程作业时可以有更多的启发。本文只是通过人类社会工程学对C语言进行了一个粗糙的刨析,事实上,我们可以基于此对C语言中的一些更加具体的操作进行分析与类比,甚至可以对内存中的储存区进行分析与说明。
另,鉴于本人见识所限,文中如有与事实不符之处,还望指出,万分感谢。
2019年2月17日
用人类社会工程学对C语言中的一些基本概念的剖析与理解的更多相关文章
- C语言中关键字restrict的概念,使用范围,例子
概念: restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容. 渊源: res ...
- C语言中对文件的读写的一些浅显理解
前述:基于上学期完成的数据结构的课程设计,对于老师的提出要求实现的基础上,自己在使用过程中发现每次打开程序都需要重新输入数据,于是便决定,将文件读写功能加入此次课程设计中,以下是我的一些心得和浅显理解 ...
- C语言中数据类型取值范围的计算的理解与总结
c语言中,数据类型有short,int,long,char,float,double,然后除了浮点型只有 有符号数(signed)外,其他的数据类型都分为有符号(signed)和无符号(unsigne ...
- C#语言中字段和属性相关知识剖析
针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...
- c语言中静态区,栈,堆的理解
对于程序员,一般来说,我们可以简单的理解为内存分为三个部分:静态区,栈,堆. 很多书没有把把堆和栈解释清楚,导致初学者总是分不清楚. 其实堆栈就是栈,而不是堆. 堆的英文是heap:栈的英文是stac ...
- c语言中指向整型指针的指针的理解
/************************************************************************* > File Name: ptr_ptr_i ...
- Kali-linux使用社会工程学工具包(SET)
社会工程学工具包(SET)是一个开源的.Python驱动的社会工程学渗透测试工具.这套工具包由David Kenned设计,而且已经成为业界部署实施社会工程学攻击的标准.SET利用人们的好奇心.信任. ...
- MetaSploit攻击实例讲解------社会工程学set攻击(kali linux 2016.2(rolling))(详细)
不多说,直接上干货! 首先,如果你是用的BT5,则set的配置文件是在 /pentest/exploits/set/set_config下. APACHE_SERVER=ONSELF_SIGNED_A ...
- 策略设计模式与c语言中的函数指针
在C语言中有一个非常重要的概念-函数指针,其最重要的功能是实现回调函数(指函数先在某处注册,而它将在稍后某个需要的时候被调用)在java语言中没有指针的概念,但是可以利用接口和指针实现类似的功能,具体 ...
随机推荐
- CORS(跨域)请求总结和测试
一.简单请求与非简单请求 跨域请求分为简单与非简单请求,同时满足以下两种条件的可以确定为简单请求. 简单请求的请求方法 请求方法 说明 head 发送头部信息 get post 简单请求的HT ...
- 如何在.NET Core控制台程序中使用依赖注入
背景介绍 依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则,可以用来减低代码之间的耦合度.在.NET Core MVC中 我们可以在Startup.cs文件的Co ...
- redis 系列24 哨兵Sentinel (中)
四. 检测下线状态 对于Redis的Sentinel中关于下线有两个不同的概念:(1)主观下线(Subjectively Down, 简称 Sdown) 指的是单个 Sentinel 实例对服务器做出 ...
- 带着新人学springboot的应用04(springboot+mybatis+redis 完)
对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...
- MongoDB Export & Import
在使用MongoDB数据库的过程中,避免不了需要将数据进行导入和导出的工作,下面为具体的用法.注意 不同的数据库版本可能存在略微的差异,所以在使用时,先查看 --help 来进行确认.下面的为3.6版 ...
- 全文检索-Elasticsearch (二) CURD
ElasticSearch6.0以上版本的增删改查基本操作基于JSON的REST API与ElasticSearch进行通信.可以使用任何HTTP客户端来通信.当然ElasticSearch自己的文档 ...
- Java 的强引用、弱引用、软引用、虚引用
1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...
- 复杂的QR_code
Topic Link http://ctf5.shiyanbar.com/stega/QR_code.png 1)打开链接之后发现是一个二维码,扫描之后出现一个字符串 secret is here 2 ...
- [ SSH框架 ] Spring框架学习之三(AOP开发和注解的使用)
一.Spring 使用 AspectJ 进行 AOP 的开发:注解的方式 1.1 引入相关的jar包 1.2 引入spring的配置文件 <?xml version="1.0" ...
- Jenkins持续集成01—Jenkins服务搭建和部署
一.介绍Jenkins 1.Jenkins概念 Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Je ...