当前位置:C++技术网 > 精选软件 > C++语言零基础入门教程:4.14 指针和内存地址的关系分析

C++语言零基础入门教程:4.14 指针和内存地址的关系分析

更新时间:2017-05-08 22:55:12浏览次数:1+次

    在《C++语言零基础入门教程:4.12 指针和内存的关系分析》一节中,我们已经讲述了指针的身世。指针并不是我们简单认识的一个数据类型而已,指针类型的特殊是因为它和内存的形态有直接的关系。指针的作用用于定位内存。我们可以利用指针,在内存中穿梭。C/C++因为可以使用指针,所以让我们的程序可以很强大。再结合类型的强制转换,我们的代码就可以很灵活。
    然而,指针的强大,是一把双刃剑。在强大灵活的同时,也带来了威胁。如果用得好,那是行云流水一气呵成的畅快感。如果用得不好,那就是一场灾难。为什么会出现灾难,这就要说说指针和内存地址的关系咯。
    你可以将指针拟人为一个超人,一个为国家为人民服务的超人。如果这个超人在国家法律范围内做各种事情,自然非常强悍。当然,如果这个超人思想发生倾斜,走入了法律之外的禁地,比如杀人,比如抢劫。因为强大的能力,必然会造成巨大的破坏。如果逾越法律的界限,国家自然会不惜一切代价灭掉这个超人。尽管之前做过好事,但是还是要灭掉或囚禁。在法律面前,是没有情面可讲的。
    在计算机中,是有绝对的法律的,不像人类法律经常会因为执法人的不公正而出现各种无视法律的情况。所以说计算机里的法律是严格而无私的!但是很多人觉得,计算机哪来的法律呢?十分不理解。
    法律是什么?法律就是一系列的规定,不可逾越的行为规则。在人类世界里,破坏法律无视法律就是犯罪。在计算机世界里,那就是计算机病毒。就算是过失,都要遭受到惩罚,因为这是不允许的。计算机里更是不用说。
    那么计算机的法律是什么呢?什么说的语法规则就是一种规定。如果你不按照语法规则编译程序,就会报错。按照语法规则编写好程序,编译好了,生成了可运行的二进制程序。这个程序就相当于一个人了。但是谁也无法保证这个人会不会犯罪。可能是过失,可能是故意。二进制程序也是如此。人无完人,计算机还是人类编写出来的,在没有完人的基础上编写的程序,自然也不会有完美的程序。所以,程序犯过失罪就太常见了。程序不同的生父就是不同的程序员,因为水平不同,生出来的程序质量不一。有的可能就是先天性的,比如一运行就被系统干掉了。另外一种就是故意犯罪。比如病毒开发者,就是要去制造破坏。
    在计算机世界里,统治者是操作系统。操作系统管理所有计算机的硬件和软件,操作系统创造了整个计算机世界,自然也就有了绝对的权利,可以制定各种规则,让程序可以在操作系统中运行。那么操作系统就相当于政府机构了。计算机中的各种规则,其实就是对资源的使用规则,比如对内存的使用规则,对其他各种硬件的使用规则。反观人类社会,法律限定的不也是对社会上各种资源的访问规则嘛。如果你用抢劫的方式,就不在资源访问的规则内,就是犯罪了。然而,在公平竞争的环境下,比如比赛,这种抢夺又是合理的。如果一个国家的法律规定,任何场景下的抢夺都是合法的,那只不过是将所有人都放在一个公平的竞争环境中罢了。其实没有什么对错,只看人民愿不愿意这么想罢了。
    所以说规则也是相对的。计算机中同样存在这样的情况。计算机中规定了内存的使用规则,也就是对内存资源的限定。操作系统自己也要内存资源。如果哪个程序去抢劫操作系统使用的资源,将会得到最严厉的惩罚,那就是当场击毙。在人类社会,一样的。不信你去抢政府的地盘试试。然而如果你只是抢劫了其他程序的地盘,也可以活得很好。在这一点上,计算机没有人类法律完善。在计算机中,反而更加野蛮。你可以随意杀掉其他进程,而不用受到惩罚。因为这个是从比较高的层次来讲的,而操作系统并不是智能的,它无法判断是否合法。现代的操作系统还只是停留在对硬件访问和保护的层次,可以说还是很低级的层次上。
    在计算机中最为重视的内存。内存就相当于人类的粮食和水。是基础而又重要的。没有这些,就无法维持生命的运转。如果一个程序在内存中拥有了一席之地,就可以长期生存下去。当然,系统还会检测程序是否有价值,如果没有价值,一样会被清除。可见,内存还是非常宝贵的。
    在计算机接通电源之前,所有硬件都是沉睡的,属于最原始的资源,此时操作系统也没有存在。这可以说是混沌世界时候,什么都不存在。而上电的瞬间,就好像宇宙大爆炸一般,开始急速的演化。各种硬件不断的被已存在的宇宙规则作用着。我们安装好的操作系统实际上就相当于布局了计算机中的宇宙规则。上电后的一系列的演化过程,都是按照我们人类设定的规则在演化。知道最后让操作系统苏醒,并运转起来。最后所有的程序都在这片计算机的土地上生活,都需要一席之地。为了生存,保守型的程序,选择遵守霸主操作系统指定的运行规则,冒进的程序就选择寻找操作系统的漏洞,从而摆脱操作系统的束缚,自由自在的运行着。
    不管是如何生存,都是为了能在内存中存活。如果程序不在内存,也就相当于死去了。内存相当于程序的物理世界,是他们每日接触的实实在在的土地。有了土地,就有了粮食。粮食是公共的CPU。在有土地的支持基础上,不断去争取CPU使用权利,从而创造更多的粮食。我们可以将CPU想象为粮食生产工具。
    对于内存的使用,就和土地规划一样的。政府用地就是操作系统使用的内存区域,是单独划出来的。其他地就是其他程序共同使用的,通过一种或多种使用规则合理合法的使用。每一个土地都有一个地址,内存中就是编号。内存中的每一个字节一个地址编号,直到最后一个内存字节为止。当然地址编制可以按照字节为单位,也可以以一组字节为单位(叫做块,好比一个地区)。反正最后对应的每一个内存都有一个可以找到的地址。
    有地址可以找到这个位置,但不是说你就可以随便进出。这就是内存地址使用规则了。计算机法律中很重要的一部分。在内存地址划分的时候,0地址为空地址,用作特殊用途,即判断指针是否有效。这样也是方便指针置空,方便检测。这一段地址,包括0地址,都是无效地址。留出来是为了方便检测指针的。然后当然也会有一些特殊的地址范围,比如军事禁地。你也无法访问。还有就是操作系统,类似各种政府机构,都不是平民可以随意进出的。还有一些地址为了其他特殊的场合使用,比如外星人研究基地,也不是我们平民能够访问的。计算机中就会为一些硬件设备单独留一些地址供他们使用。反正就是,世界上有很多我们平民是无法访问的地方,这些地方都是我们被禁止访问的地方。计算机中也是一样一样的。
    那么剩余可以使用的内存,就是我们大众平民可以使用的了。只要在这些内存中,都不会犯法。如果触及禁区,触网就毙命。这是计算机严格的地方,绝不给你留情。你想去攻击操作系统被禁止访问的内存地址,那么结果就是被系统干掉,绝不留情。
    你以为内存地址就只是内存地址吗?那就太天真了哦。内存地址涉及到太多的东西了。这就好像你只是把土地当做是务农的作用,殊不知,各大城市将土地作为房地产炒到天上去了。为什么这种不合理的现象却存在呢?因为法律并没有规定不允许。另外,土地就和内存一样,牵涉的东西太多了,很复杂。而指针只是去接触内存的东西,自然也是了不得的人物了。
    我们通常会觉得那些有很多政府资源的人了不得,其实指针就是这类人物。所以指针是非常强大的。很多人赞叹指针的威力,就和我们赞叹那些有政府资源的人是差不多的。
    总结下,内存地址是计算机资源分配中至关重要的一部分。指针是访问和操作内存地址的,所以指针是踩在法律的边缘的,一方面可以很强大,另一方面,也很容易犯错。一旦犯错,就会被系统惩罚。最严重的错误就是卖国!因为这个可能导致整个国家的灭亡。计算机中会导致操作系统崩溃。内存地址是编程中接触操作系统核心的途径,强大而危险。内存地址可以反映出整个操作系统的生态关系。这一节主要是让你感受内存地址的威力,而不只是一个数字。我们目的是让你真正喜欢上编程,感受到编程的魅力。我们一步步深入理解计算机,爱上编程。