欢迎来到老马的领地~ 这是“压风式散热底座”发明者的个人网站:) 本人QQ:80524554,用户群1:562279766
刚和一个朋友聊天,聊到了编程,他就说,以前大学时学过C语言,学到指针那一块,就完全懵逼了
我就说了句"指针有那么难吗",收到一个白眼以及一句话:
你都十几二十年的老程序员了,当然觉得不难.
还说了一大堆什么"指针很危险","一不注意程序就崩溃","不好好处理就会有莫名其妙的结果"之类的话
我默默喝了一口水,心里想着,我要是不把这个逼装好,我这老程序员的人设怕是要崩....
我问道:"你去菜鸟驿站取快递,是怎么取的?"
他答道:"当然是拿到取件码,按上面的区-层-快递码找啊."
说明一下,我们这边的菜鸟驿站是会在收到快递后,发送一个4-2-5239这样的三级取件码给收件人,然后收件人自己去驿站里根据这个取件码找到快递,并在出口处扫描单号出库.
整个过程是自助的,店老板只负责录入,由取件人自己去找.
我点了点头说:"那恭喜你,你已经学会使用指针了."
这下轮到我朋友一脸懵逼了:"我怎么就会了??"
我解释道:"其实指针就是一个'内存取件码',有了一个指针,就等于知道了一块内存'快递架'的位置,你就可以去正确操作你的快递了.
指针这玩意,用得不对,确实会有一堆问题产生,但其本质就是一个这样的东西,一个取件码而已.
仅此而已."
我朋友:"就这?没了?"
我:"不然呢?虽然不正确的使用,会让你操作到了别人的快递,但那是因为你用错了啊.指针这玩意的本质确实就是这么简单,指向一个内存格子的地址码."
我把内存的每个字节给说成了"格子",方便他理解.
然后又讲了一下不同类型的变量,所占的格子的大小的区别,以及为什么指针虽然是个长度不变的数据,却又有类型的区别----因为指向不同大小的"格子"时,需要让编译器帮你优化下,以方便一些操作.
例如char*的指针+1,其地址值就是+1,因为目标变量的"格子大小"就是1;
同理,word*型指针+1,那其地址值就是+2了,因为word变量是两个字节.
因为对于编译器来说,指针+1,就是按指针的类型进行地址移动的.
所以void*类型的指针,就是最牛逼的指针了,编译器啥也不管,你给我啥地址我就访问啥地址,一成不变-----------因为编译器特么的哪知道目标地址的"格子"是啥类型啊,统统按最小的1字节算.
这些都是编译器干的活,理解了就行了.
但后面这段我就没太深入展开了,因为他可不是程序员,没必要.
看着这哥们若有所思的样子,我心想,这个逼应该算是装成功了吧?
我就说了句"指针有那么难吗",收到一个白眼以及一句话:
你都十几二十年的老程序员了,当然觉得不难.
还说了一大堆什么"指针很危险","一不注意程序就崩溃","不好好处理就会有莫名其妙的结果"之类的话
我默默喝了一口水,心里想着,我要是不把这个逼装好,我这老程序员的人设怕是要崩....
我问道:"你去菜鸟驿站取快递,是怎么取的?"
他答道:"当然是拿到取件码,按上面的区-层-快递码找啊."
说明一下,我们这边的菜鸟驿站是会在收到快递后,发送一个4-2-5239这样的三级取件码给收件人,然后收件人自己去驿站里根据这个取件码找到快递,并在出口处扫描单号出库.
整个过程是自助的,店老板只负责录入,由取件人自己去找.
我点了点头说:"那恭喜你,你已经学会使用指针了."
这下轮到我朋友一脸懵逼了:"我怎么就会了??"
我解释道:"其实指针就是一个'内存取件码',有了一个指针,就等于知道了一块内存'快递架'的位置,你就可以去正确操作你的快递了.
指针这玩意,用得不对,确实会有一堆问题产生,但其本质就是一个这样的东西,一个取件码而已.
仅此而已."
我朋友:"就这?没了?"
我:"不然呢?虽然不正确的使用,会让你操作到了别人的快递,但那是因为你用错了啊.指针这玩意的本质确实就是这么简单,指向一个内存格子的地址码."
我把内存的每个字节给说成了"格子",方便他理解.
然后又讲了一下不同类型的变量,所占的格子的大小的区别,以及为什么指针虽然是个长度不变的数据,却又有类型的区别----因为指向不同大小的"格子"时,需要让编译器帮你优化下,以方便一些操作.
例如char*的指针+1,其地址值就是+1,因为目标变量的"格子大小"就是1;
同理,word*型指针+1,那其地址值就是+2了,因为word变量是两个字节.
因为对于编译器来说,指针+1,就是按指针的类型进行地址移动的.
所以void*类型的指针,就是最牛逼的指针了,编译器啥也不管,你给我啥地址我就访问啥地址,一成不变-----------因为编译器特么的哪知道目标地址的"格子"是啥类型啊,统统按最小的1字节算.
这些都是编译器干的活,理解了就行了.
但后面这段我就没太深入展开了,因为他可不是程序员,没必要.
看着这哥们若有所思的样子,我心想,这个逼应该算是装成功了吧?
添加评论
GB2312 http://www.m5home.com/blog/trackback.php?id=122&encode=gb2312
UTF-8 http://www.m5home.com/blog/trackback.php?id=122&encode=utf-8