| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 31744 人关注过本帖, 49 人收藏
标题:[原创]让指针不再困扰你
只看楼主 加入收藏
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏(49)
 问题点数:0 回复次数:137 
[原创]让指针不再困扰你
声明:moonwalker 作于2008年4月26日 转载请注明出处
    指针对一部分初学者来说一直是一个无法逾越的障碍,没有指针的C语言就好像没有左腿的短跑运动员。今天我来试试换一种方法来理解指针,希望能帮还在为指针挣扎的朋友们理清思路,高手略过即可。
    我们先认为内存是一家客栈(看起来这和老掉牙的大楼的比喻没什么区别,但是请你耐心看下去)。
同大部分的客栈一样,这家客栈有天、地、人等各种档次的房间,用现在的话就是单人间、双人间、四人间等等。来住店的客人也是车水马龙,三教九流都有,我们看看都有哪些人:
    快乐单身汉char,还有char的小弟unsigned char,他们只住单人间;
    short int, unsigned short int都是已婚无孩,他们只住二人间;
    int, unsigned int, long int, unsigned long int,这些都是四口之家,当然住四人间了;说起来这里面的前两位,int和 unsigned char,在dos时代还是二人世界,住二人间,后来出了32位系统后,他们才成为四口之家,等到了64位时代,他们中有人会变成8口之家。人口变化太快,所以人口问题就不讨论了,只要知道有几口人(几个字节)就住几人间就行了。
    另外还有一些更庞大的家庭double,float我们就不一一赘述了。
    住客栈是要登记的,至少老板要知道哪个房间没人住,好租给新来的客人吧?于是就把每位客人的房间号都记在了纸上,然后把纸卷在了针上,大大节省了空间,这就是纸针(指针*)啦,^_^。为了安全,登记完的指针也放在客房里了,不过是没有人住的房间。
    为了区分不同身份的客人(本客栈不搞歧视,区分身份只是为了便于管理),客栈用颜色不同的纸来记录房间号,这就有了不同类型的指针,比如蓝色的char*这种指针只记录单人间的房间号,红色的int*只记录四人间的。看起来分这么多种类很混乱,但是如果有很多同类型的组团(数组)来住店时就方便了,上次int a[100]来旅游的时候,就找到那一沓100张红色的指针就可以知道谁住哪里了。比如团长a[0]的房间号记在第一张纸p上,那么翻开下一页(p++)你就找到了隔壁的房间号,你拿前四张去找人正好可以凑一桌麻将了。
虽然指针分为很多颜色(类型),但是不管多大的家族都只住一间屋子,只有一个房间号,所以无论什么颜色的指针都具有相同的大小,长度就是房间号那么长。
并非所有人都像int a[100]那么幸运,他们来的时候正好一层100个房间都没人住,于是他们可以住在同一片连续的区域。上次m, n, p, q, r一起来想住连续的几个屋子,方便一起去玩,偏偏找不到合适的房间,只好m住3楼,n住5楼,…,总之都很远。可是m老是来问老板他的朋友们住哪里?老板每次要找半天,后来想了个办法,把记录这几个人的指针用一个盒子*p[5](指针数组)放在一起,这样就方便多了。
    有的客人脾气很怪,比如char F[4],他们四个是一个乐队的,可是又不愿住四人间,非要一人住一间,还一定是连着的,如果不连着就不住,老板没办法,给他们找了连着的四间房。可是大牌还真是难缠,他们早上出去工作就退房,晚上又要回来住,老板又要给他们找连续的四间房,天天如此,而且每次都浪费四个指针,客栈的成本一下提高了。老板又想了个办法,他专门为这些人订做了另一种颜色的指针(*p)[4](指向数组的指针),他用这个指针记录他们老大F[0]的房间号,剩下的三位房间号就是紧挨着的三间,减少了不少浪费。
    一直忘了介绍客栈的两个伙计,一个叫“小&”,另一个叫”小*”,看外形就知道,”小*”比较圆滑,肯定是经常可客人,而“小&”肚子比较大,一看就是常年打算盘,记帐不活动造成的。有时候有人来客栈找住店的人,首先要查找客人的房间,“小&”就是负责去取保存房间号的指针的,比如上面提到的m想找r去逛街,“小&”就去找r的指针了(&r), “小&”找了半天,终于找到了r的指针p(p = &r),他把p交给”小*”, ”小*”就拿着p去叫客人了(*p就是r了)。看起来好像”小*”的工作比“小&”轻松,其实”小*”也不容易,他要区分指针的颜色(类型)来决定叫多少个人,比如拿的是蓝色的指针(上面说得是char型),就只叫一个客人就可以,如果是红色的(int)就得叫4位客人,如果少叫了一位楼下找人得客人会生气得,因为没有把要找的人找全。
    好了,这家客栈介绍完了,为了感谢你看到这里,现在客栈经营权就交给你了,希望你财源广进!
搜索更多相关主题的帖子: 指针 困扰 
2008-04-26 21:22
mqh21364
Rank: 1
等 级:新手上路
帖 子:642
专家分:0
注 册:2008-2-28
收藏
得分:0 
不错。。。。。顶了。。。。。。。。。。。。。。。。

前不见古人,后不见来者。念天地之悠悠,独怆然而涕下。
2008-04-29 10:33
liyanhong520
Rank: 1
来 自:水星
等 级:新手上路
帖 子:62
专家分:0
注 册:2008-3-17
收藏
得分:0 
的确不错
顶一下
2008-04-29 11:52
乱风狂舞
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-23
收藏
得分:0 
顶一个
2008-04-29 18:20
liyanhong520
Rank: 1
来 自:水星
等 级:新手上路
帖 子:62
专家分:0
注 册:2008-3-17
收藏
得分:0 
再顶一次
实在太有才了
2008-04-29 18:49
一生戏
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-3-10
收藏
得分:0 
有了些感悟,顶了
2008-04-29 19:31
思考ING
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:140
专家分:0
注 册:2008-3-12
收藏
得分:0 
想象力蛮丰富的!讲解的也不错!!

天生孤独的思考~~~~~~~~~
2008-04-29 19:57
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
有才!顶一个……MS这个比方好像很久以前看过了……好像是在讲无穷大的时候……那个……希伯来字母第一个怎么读,有谁知道?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-04-29 20:39
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
[bo]以下是引用 [un]StarWing83[/un] 在 2008-4-29 20:39 的发言:[/bo]

有才!顶一个……MS这个比方好像很久以前看过了……好像是在讲无穷大的时候……那个……希伯来字母第一个怎么读,有谁知道?

&读成and就行

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-04-29 22:22
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
那个……我刚才百度到了,读“阿莱夫”,即aleph……代表无穷基数。aleph-0是全体自然数的数目,aleph-1是全体实数的数目,aleph-2是全体函数的数目……都是无穷大……
我记得那篇文章是说,如果一个旅店有无穷个房间,但是每个房间都住满了人。要求再搬一个人进去,怎么办?答案是这个人住第一个房间,第一个房间搬到第二个房间去,第二个房间搬到第三个房间去……以此类推,因为房间有无穷个,所以总会全部住下的。得出结论是aleph-* + 1=aleph-*
嘿嘿,似乎跑题了……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-04-29 22:50
快速回复:[原创]让指针不再困扰你
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028793 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved