vlambda博客
学习文章列表

初级准备15-计算机5·C语言2·初识指针

      讲到了运存(内存),不讲讲指针,怎么对得起C语言老师,虽然我没有学过。指针是C语言中很硬核的一个知识点,千万不能轻视。


      现在我们移步到运存的一个示范点,嘉定4GB大仓储,从外观看,是八片512MB ram组合而成。你可以理解为这个仓储分为8个园区,每个园区都划成很多64米*64米的小方格,小方格称为摊位,一平米可以存储一个字节(Byte),就是8位(bit)。我们的程序们,就是来租借场地的食材供应商。


       每个供应商需要准备至少三个区域,第一个是熟食区,存放已经定型的硬核产品;第二个是半加工区,有的产品能存挺久,有的要经常更换;第三个是时鲜区,有什么存货都是跟着时间来的。


       熟食区对应我们的代码段(text segment),编译完之后就不变了,是成品。可以简单理解成程序本身。


       半加工区对应数据段,包括已初始化的数据段(.data)和未初始化的数据段(.bss,Block Started by Symbol缩写),前者用来存放保存全局的和静态的已初始化变量,后者用来保存全局的和静态的未初始化变量。


       时鲜区分两种,一种是本地时鲜,不仅遵循国家规范,还要遵循上海市当地食品规范,品种数量少,规范细致,我们叫做栈(stack),因为规范严格,所以栈的空间不会很大。


     另一种是进口时鲜,品种很多,符合各国家规范即可。我们称为堆(heap),堆的空间相对就非常大了。


       关于代码段、数据段、栈、堆,现在不能理解,没有关系,有个印象就行。我们初级阶段关注的,是指针。


       首先,摊位是租赁的最小单位,你的货物只需5平米就能摆下的话,对不起,内存不支持租5平米,通常起租必须是4096平米(4KB),这个摊位在内存中称为页(page)。


       每个供应商可以租多个摊位,只要仓储没有租满,供应商还能随时新租摊位。每个供应商还要标识自己的场地,比如用根彩带圈起来,挂个招牌,“XX供应商”,如果连续租了10个摊位,那么也只需要用彩带圈一个大圈,挂一个招牌,这样别人不会找错你的店。这个圈,就叫做段(segment)。一个程序可以拥有不止一个段。


       整个仓储的最小单位,是一平米,对应内存中的1byte。但这并不代表你最少可以买1平米的货物。虽然我们编程会遇到的最短数据长度是byte,数据类型有char,还有bool,U8,S8。但我们的CPU往往是32位(或者是64位,当然也有其它)的,为了简化其中的逻辑,CPU和内存之间只允许批发,不允许零售,一次交易至少是32位,4byte。因此通常的硬件设计中,你能买货物的最小单位是4平米(或8平米)。买到手之后,多余的货物扔到垃圾桶就行了。虽然浪费,但是设计简单了,能降低成本。



       想到孔乙己说的,茴香的茴有五种写法,我不禁想到指针的针有十种取法。我们不详述全部寻址方法,就列三种。具体可以参考《计算机组成原理》。


       首先,内存里前排是VIP区,是给操作系统使用的,Linux中称内核空间,windows我不知道。虽然WIN安装完有将近20GB,但是需要加载到内存运行的并没有那么多,可能1、2G吧,不深究。后排的用户空间才是供应商们(用户程序)的天地。





      好了,现在我们至少知道一点了,一个十进制数字65,如果是char型,计算机识别它为“A”,如果是int型,计算机识别它为数字65,如果是指针,指针有很多种写法,先给通用的void *,那么这个65是什么意思呢,意思是从内存的最低位开始数,第66位。想到了当初小滨哥介绍的行规吗?数第几位,是从第0位开始,所以要加1。