专栏首页轮子工厂我可能早就到阿里腾讯上班去了,如果早点知道这种学编程的方法的话

我可能早就到阿里腾讯上班去了,如果早点知道这种学编程的方法的话

最近在学C语言程序设计时总是遇到一些概念上不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影《我是谁,没有一个系统是安全的》,里面的主角用社会工程学的想法结合黑客技术化险为夷,给了我很大的震撼与启发。

所以我想如果将现实中C语言的一些概念和人类社会联系起来,会不会产生一些奇妙的结果。

首先我们应该先从C语言中最基本的概念开始(如果能将C语言中的基本概念与人类社会中的一些基本的概念联系起来的话,根据图灵计算的原理,那么我的这种想法很有可能也行得通)。

如果将变量与常量比作住在房子里的人的话,那么地址就可以认为是那个人(常量或变量)所住的房子的门牌号,每一个人(变量与常量)都有一个属于自己的门牌号(地址)。

指针就可以理解为一个指路牌,指路牌上有门牌号(地址),通过这个门牌号可以找到住在这个房子里的人。

与现实世界不同的是,计算机中的世界上是一维的,也就是说,我们(用户)通过指路牌(指针)就可以准确无误的找到我们要找的那个人(变量或常量)。

这就是我们说为什么指针是C语言中最重要的概念的原因(如果你还不明白,可以自己去百度一下图灵机)。

还有一个基本概念就是内存,我们可以将它类比成房产局,只有向房产局(内存)申请才能获得住在房子(地址)里的权力。

有了以上的概念,那么我们就可以定义一些相对复杂的东西,例如数组,我们知道数组是由许多单一数据类型组成的集合,那么我们就可以将它类比成一个小区,小区里由若干个人(变量)组成,而且每个人(变量)的门牌号(地址)都按一定的规则排放。

特别的,我们知道数组一般在程序中除了初始化外很难直接被整体改变,我们可以理解为一个小区(数组)中的人(变量)太多,当你要对它进行改变时过于麻烦,而若只改变指路牌(指针),那么工作量就会小很多。

类似的,对函数我们可以认为它是一个公司,里面有许多不同类型的人(变量)组成,每个人(变量)各司其职,通过一些工具(C语言中的基础语句,如if语句,以及库函数)来实现用户的目的。

同样,我们可以将结构体看作一个街道,一个街道可能包括一些个体户(变量),一些小区(数组),甚至公司(函数),不过公司(函数)太过庞大,没法全部过来,只能将门牌号(地址)挂在这里,通过指路牌(指针)可以找到它。

与现实中的公司类似,如果一个公司(函数)十分庞大,甚至会包含一个或几个街道,这时,如果函数想要使用结构体,只需知道结构体的变量名以及其中的成员名即可。

值得注意的是,如果你在声明结构体时只声明了结构体名,那么内存是不会分配内存空间的,可以理解为,你只在房产局(内存)提出了想建立一个街道(结构体)的申请,但是并没有告诉房产局(内存)你的街道(结构体)叫什么名字,所以房产局(内存)自然不可能给你分配房子(地址)。

在结构体变量作函数参数时,也需要同时声明结构体名与变量名。

对程序而言,调用变量有两种方法,一种是根据变量名直接调用,一种是根据指针调用。

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

发现了吗? 通过将人类社会工程学原理引入到C语言的程序设计中,我们可以更好的理解C语言中的一些概念,这可以降低初学者们学习时的难度,同时也可以反窥C语言的创造者们在编写C语言时的逻辑历程,这对我们以后进行工程作业时可以有更多的启发。

本文只是通过人类社会工程学原理对C语言进行了一个粗糙的解释与刨析,事实上,我们可以基于此对C语言中的一些更加具体的操作进行分析与类比,甚至还可以对内存中的储存区进行分析与说明。如果你有什么类似的理解也可以在留言区和大家一起分享!

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

本文分享自微信公众号 - 轮子工厂(Programmer-ing)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 让我第3不开心的事是:同样是程序员,你竟然选择了偷懒~

    好几个人在后台催更C语言教程,其实我也很委屈鸭,呆博去浪去了,然后他就义正言辞的和我说不想排版推文,一听就是想要偷懒的借口,口亨~

    谭庆波
  • 好吧,又是两分钟看完一道投机取巧的算法题

    事实上,你在使用暴力破解法的过程中就能发现规律: 这 9 个数字中只有 2(它的倍数) 与 5 (它的倍数)相乘才有 0 出现。

    谭庆波
  • 如何入门计算机视觉,10条你不能不看的总结

    目前,人工智能,机器学习,深度学习,计算机视觉等已经成为新时代的风向标。这篇文章主要介绍了下面几点: 第一点,如果说你要入门计算机视觉,需要了解哪一些基础知识...

    谭庆波
  • 高性能:8-可用于Memory分析的BPF工具【bpf performance tools读书笔记】

    内核和处理器负责将虚拟内存映射到物理内存。为了提高效率,会在称为页面的内存组中创建内存映射,其中每个页面的大小是处理器的详细信息。尽管大多数处理器也支持更大的容...

    二狗不要跑
  • .NET资源泄露与处理方案

    很常见的现象是分不清哪些对象需要释放,对于控件、Stream等一些非托管资源也只管新增,却没有释放,功能是实现了,却埋了颗不小的雷。

    梁规晓
  • 经典面试题-GC是什么,为什么要有GC

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • Java并发编程:Java内存模型JMM

    Java内存模型英文叫做(Java Memory Model),简称为JMM。Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异...

    Happyjava
  • Spring Boot引起的“堆外内存泄漏”排查及经验总结

    为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常。笔者被叫...

    美团技术团队
  • flink二三事(2):起家的技术

    上一篇聊到flink的历史,请看上篇 flink两三事 ----(1)历史。 可以说基本上是起了个大早,赶了个晚集,但是flink能做今天这种热度,没有被spa...

    大数据和云计算技术
  • 浅谈计算机中的存储模型(一)物理内存

    今天,我们来了解一下计算机中的存储模型,大雄将这部分知识分成了三块,也就是我们会对这部分的知识推送三次。

    老九君

扫码关注云+社区

领取腾讯云代金券