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

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

更新时间:2017-05-07 22:05:32浏览次数:1+次

    很久没有更新C++教程了,原因有:
1.我们的教程是我全新写的一套教程,不照搬任何一本书的教程目录,都是根据我多年的经验和理解来写的,以初学者的身份,深入浅出学习C++,浅显易懂。所以写起来颇为费劲。
2.网站还主要是公益为主,基本上没有什么收入,不接受乱七八糟的广告。现在主要以会员费维持网站的运营,要花时间和精力提供会员服务。会员费也很低,所以也没有多少资金,只能说勉强凑合网站的运营。
3.工作忙了,项目赶的紧,而且都是研发型工作,都是没有做过的技术,一方面也是学习,花时间自然也多了。
4.网站基本没有什么收入,也没有资金来请人维护。而且尽管我们的会员费这么低了,开会员的也不是太多。

    以上的原因,主要还是第一个为主。这也是卡住绝大部分教程写作的难关。国内教程基本都是抄来抄去,罗列知识点而已,实在没有太多价值。我在更新这个教程的过程,也深有体会。在现在社会氛围下,钱少了都不干,更何况不赚钱的方式呢?
    我说这么多,不是为我很久没有更新教程找借口,只是这是客观存在的。所以请各位多多理解。在每受到一份肯定的时候,我就感觉到更多的一份责任。我希望将我所学的都能够毫无保留的分享出来。
    好了,好久不见,就多说了几句。后续将持续更新。回到正题,开始讲课啦。

    在《C++语言零基础入门教程:4.11 指针类型的初探分析》一节中,我们通过形象的生活场景讲解了指针类型的概念。如果你没有看,请先看看。
    指针是C语言的灵活,是C++的基础。指针的重要性就不多说。所以,我们讲述到指针类型时,将会慢慢铺开,我们一步步的熟悉,并深刻认识到指针的各方面。对于指针的掌握,对于今后的编程生涯都是至关重要的。

        计算机内存是一个热存储的硬件设备,也就是通电时可以存储数据,断电后存储单元电量丢失,所有数据没有了。所以可以叫做热存储,有点就热,没电就冷了。因为内存读写的速度很快,所以可以为CPU提供数据。CPU只是一个执行运算的部件,本身是不存储东西的。这样一来,内存就相当于CPU计算时临时存储数据的场所。硬盘虽然能够存储数据,但是速度太慢太慢了。CPU好比是飞机,硬盘是蜗牛。你想CPU那么快的速度,去问蜗牛要数据,那速度能跟上吗?而内存好比是空中加油机,虽然速度不够CPU快,但是还是可以了的。

        下面先给一个示意图:

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

    而内存存储数据的方式是用一个个的字节为单位来存储的。一个字节有8位,这个8位就是内存条硬件对小的单元了,用来表示0或1的。一般是盛放电荷的小小部件。如果有电荷可以看成是1,没有电荷就是0。也可以将有超过一半电荷看成1,不足一半电荷看成0。具体是哪样,和具体的硬件实现有关,这个在电子电路课程有介绍。那么这样的小小部件就是我们说的bit比特位。8个比特位就组成了一个字节。
    在计算机处理数据的时候,我们的单位都是字节,也就是8个比特位为一组。当我们在学习数据处理时,我们会接触到位操作,位操作就是对比特位进行操作。你想想你要是可以控制内存条里最小的部件,那是多么神奇的事情呀。虽然你看不到,但确确实实操作了。
    那么字节的多少,就构成了内存的存储容量。很早很早是以KB为单位的,再后来以MB为单位,再到现在就是GB为单位了,大型计算机或超级计算机的内存都可以是TB的。容量在不停的增加的。一个内存硬件就固定了内存的容量。在很早的时候,以KB为单位的时候,也就是2的10次方的时候。也就是说,我们用一个10位的比特位的存储位数,就可以表示1KB的大小。一个比特位可以表示两个,两个比特位就有四种组合,所以位数越多,组合也就越多,一个组合也就是二进制的一个数。内存的容量的字节数以及每一个字节的位置,就可以用一个数字进行编号。也就是说,1KB的内存,我们只需要再单独提供一个10比特的硬件,可以看做是迷你内存,就可以记录表示内存每一个位置的内存。改变这个迷你内存10个比特位的数值,得到不同的数字,也就表示你要定位到哪一个编号的内存字节了。那么这个迷你内存就是用来专门定位内存位置的,它叫做寄存器。寄存器就是一个专用的存储硬件,速度比内存还快,CPU可以直接操作寄存器,然后通过寄存器来定位内存字节。
    CPU要执行指令,也就是从内存取出来的。CPU要找到内存字节的位置,就要通过寄存器存储的数值来定位内存的字节位置,然后读入CPU内计算。这个过程涉及到两个寄存器,一个值存储一条指令的寄存器(指令寄存器,IR,Instruction Register),一个是存储下一个指令的寄存器(指令指针寄存器,IP,Instruction Register)。CPU只是执行计算的,所以它从内存取到一条指令,要存在临时的一个高速存储器,然后可能要将之前计算的结果和当前读入的数据或指令进行混合处理。这些寄存器的速度和CPU的速度是差不多的。那么IP寄存器存储了下一条执行指令的内存的位置的,方便下次去取指令。
    我们不用太在意IR寄存器,我们此次的主角是IP寄存器。我们叫它为指令指针寄存器。因为这个寄存器存储的数据就是内存的地址。存储地址的数据类型是什么,就是我们上节课说的指针类型咯。但是这个寄存器是CPU专用的,这里的指针只说是具备指针类型的特性了。但不是我们编程中能够直接操作的指针类型哦。
    寄存器比内存还贵,所以不宜多用,不然成本就更高了。在以前的年代,内存就很贵了。那时候内存容量也很小。我们给定一个16位的寄存器,我们就可以定位64KB的内存了。我们给定一个24位的寄存器,就可以定位16MB的内存了。我们现在给定一个32位的寄存器,我们既可以定位4GB大的内存了。
    定位内存也就是指针的作用。没有内存,也就不需要指针了。像寄存器,总共就那么些位,用不着。当然后来存储的设备越来越多了,指针的作用就是定位。自然,指针也可以用来定位硬盘的存储空间,前提是对存储单元进行线性编号,从0,1,2,3...这样排。指针存储的每一个数字都代表了一个存储地址,不是无意义的一个数字。这也就是指针值的含义,即内存地址那个数字的含义,和普通的数字不一样。
    我们用寄存器存储地址,代价昂贵。而且寄存器的硬件固定了就固定了,不会随便改了。然而内存则不一样。内存有大量的存储空间,每一个小单元是一个字节,每一个字节都有编号。我们不仅可以用寄存器存储内存地址的编号,当然我们也可以用内存存储内存某一个字节的编号,也就是存储某一个内存字节的地址。那么存储某一个内存地址的这个字节或者几个字节组成的字节序列就构成了指针值存储区。存储在这里的是地址,是可以访问到的字节的位置。我们在编程上就将这块存储区对应的那个变量叫做指针变量,这个存储区存储的值就是内存地址值。因为内存的存储空间,相对于寄存器就大多了。我们在内存中可以存储很多程序供CPU执行,自然会存储很多内存地址,供程序进行跳转,以执行不同的流程。所以内存中可以存储大量的内存地址,而一个寄存器也就只能存一个内存地址。这样内存也就相对廉价很多了。以后需要增加一个内存地址,也就是多用一些内存空间而已,扩展性非常好,不需要焊接一个寄存器硬件。
    总结一下,指针数据类型就是用来定位内存字节位置的类型,然后指针变量存储其他内存字节位置,可以形成隐形的连接,这就是指针的含义。指针变量存储的值就是内存地址。