指针一直是个头疼的问题,看林锐写的指导,他当初写了十万行代码但是就是避免用指针全部用数组,可见指针确实令人生畏惧------另一个令程序员头疼的是中断。他们有同一个性质:跟硬件太相关,而硬件又设计得偏偏很复杂,偏偏硬件和软件又是貌似两种思维模式,能融会贯通的人数量不多。所以我打算从硬件端说一下指针的由来。
事情得从计算机体系结构开始。
1) 速度:
CPU在设计的时候(知道为什么Linus大神跑到一个设计CPU的名不见经传的公司去打工了吧,他是为了彻底搞清楚这件事),内部是有一堆“寄存器”的,register,简写reg。比如verilog语言是这样定义的:
reg [31:0] regA;
然后CPU内的控制单元往regA里面读写数据因为在CPU内部,速度非常之快,并且可以流水。并且把regA加或者减1这种运算也非常之快,不需要往外部总线上去取数据,写完还要存回去。
辣么,如果我要读一堆地址连续的数据,直接把寄存器regA++,然后按照regA的值去查找内存,速度也会快很多,比先查找内存某个地方得到地址数据,再改变地址总线数据去找那个数据要节省N次总线访问的时间。
通常CPU芯片设计里会有个“寄存器堆”,有很多寄存器可用。我猜编译器在用完register之后也许会用内存里面的某个地址作为指针,但是现在很多书和文章直接说指针就是存在内存中的一段地址,这是不靠谱的。那样速度优势并没有发挥出来。
而内存在verilog里面例如是这样定义的:
reg [31:0] mem [1023:0]; //这是一个32bit宽1K深度的内存
它需要通过总线和地址来访问。
2)方便:数组操作
我觉得指针最大好处是方便数组操作,当你需要连续读取一堆连续地址的数据时,真是太爽了!
3)可以用来写底层驱动
写底层驱动你必须得亲自操作总线去访问外设的寄存器(又是寄存器,不过性质真的和CPU里的寄存器一样)。假如没有指针,怎么去访问总线?
4)函数指针传递
待续。。。有时间再加