面向指针编程的那些事绪论.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
面向指针编程的那些事时间:2015-12-31 19:23????点击:22次面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数编程(亦即函数式编程),面向多核时代的并行编程,面向大数据的机器学习编程……这么多年,大家要面向的东西已经够多了,然而我看到的现象是,很多编程语言让大家面向 xxx 的同时在竭力回避指针。我可不想面向这么多东西,所以我只好加入指针的黑暗势力。我要不自量力的来写一篇《面向指针编程》作为投名状,借以表示我与软件世界的光明势力的彻底决裂。这个世界上,提供指针的编程语言很少,这样的语言有汇编语言、C/C++ 以及 Pascal 等。Pascal 我没学过。汇编语言过于黑暗,我现在功力还不足以驾驭它。C++,我觉得它简直是黑暗势力中的败类——它试图挣脱指针,走向光明,结果却出了一堆幺蛾子。所以我还是俗套的选 C 语言来阐述指针的黑暗力量。阅读本文之前,请读三遍 Unix 无名师说的话:当尊者 Ritchie 发明 C 时,他将程序员放到缓冲溢出、堆损坏和烂指针 bug 的地狱中惩罚。然后自我安慰一下,如果地狱未能使我屈服,那么我会比地狱更黑暗更强大。指针是什么?内存是以字节为单位的一个很大但是又经常不够用的空间。指针是内存中 x 个连续的字节中存储的数据——在 32 位的机器上,x 的值为 4;在 64 位机器上,x 值为 8。为了叙述的简便,本文只在 64 位的机器上谈论指针。指针是一种数据,这没什么稀奇的。从机器的角度来看,程序的一切是存放在数组中的数据。只有那些自作多情的程序猿才会像亚里士多德一样自作多情的认为程序是由对象 + 方法或者许多函数复合而成的。事实上,从最远离机器的 Lisp 语言的角度来看,程序的一切也都是数据,存放在表中的数据。如果忽视程序本身就是数据这个客观事实,程序猿们很容易就走上了形而上学的道路,然后他们会度过漫长的、罪恶的、痛苦的中世纪,膜拜着一个又一个神棍,当然期间也出现了几位圣·奥古斯丁。那么,指针中存储着什么数据?内存地址。内存是以字节为单位的空间,其中每个字节都伴随着一个地址,这个地址机器赋予的,并不是我们的程序编制的。你可以将整个内存空间想象成一栋大楼,将字节想象为大楼中每个房间,将每个字节的地址想象为房间的门牌号,于是指针中存储的数据就类似于门牌号。如果你从未学过 C 语言,读到此处可能会问,我们为什么要在内存中存储内存地址?不知你是否住过宾馆。在正规的宾馆里,每个房间的门后都会贴着逃生路线图,图中『存储』了该宾馆与你的房间同一楼层内的全部房间的门牌号以及它们的布局。如果你住酒店时从来也不看逃生路线图,那么从现在开始,入住酒店后第一件事就是认真的看一下它,关键时刻它能救你一命。在内存中存储内存地址,虽然不是救你性命的,但是可以藉此构造与宾馆逃生路线图相似的抽象事物——内存数据的抽象与复合。内存空间的有名与无名现在来看两行 C 代码:int?foo = 10;int?*bar = foo;foo?是什么?foo?表示一个内存地址。foo?前面的?int?是数据类型修饰,它表示?foo?是内存中 4 个连续字节的首字节地址( 64 位机器上,int?类型的数据长度为 4 个字节)。C 编译器总是会根据某个内存地址相应的类型来确定以该内存地址起始的一段连续字节中所存储的数据的逻辑意义。因此,当我们用?int?类型来修饰?foo,编译器就会认为以?foo?开始的连续 4 个字节中存储的数据是一个整型数据。在上述代码中,这个整型数据是?10,我们通过赋值运算符?=?将这个整型数保存到内存中以?foo?地址开始的连续 4 个字节中。从此刻开始,要记住一个事实,那就是?C 语言中所有的变量名,本质上都是内存地址。之所以不直接使用内存地址,而是使用一些有意义的名字,这就类似于没人愿意用你的身份证号来称呼你,大家更愿意用你的姓名来称呼你。由于 C 语言认为数据的长度是由其类型确定的。例如,int?类型的数据长度是 4 个字节,char?类型的数据长度是是 1 个字节,用户自定义的?struct?类型的数据长度则是根据实际情况而待定。在这种情况下,所有表示内存地址的名字,它们实质上表示的是内存中各种类型数据存储空间的起始地址——专业一点,就是基地址。凡是用名字来表示基地址的内存空间,我们就将其称为有名的内存空间。再来看?bar?是什么?bar?是内存地址的名字,由于?bar?前面有个?*?号,这表示我们打算在以 bar 为基地址的连续 8 个字节中存储一个内存地址(别忘了,我们是在 64 位机器上,指针数据的长度是 8 个字节)——foo?所表示的那个地址,亦即?foo。在这里,??是取值符,它会对?foo?说,你甭给我耍花样了,老实交代你

您可能关注的文档

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档