登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

A1Pass的风清月朗居

追随技术的巅峰,突破欲望的枷锁!我,是技术与精神的享乐者!

 
 
 
 
 

日志

 
 

由《说C·指针》想到的  

2008-07-21 08:39:17|  分类: 思绪燃星火——技 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

题记:C的魅力果然是无穷的……

 

转载请注明版权 作者:A1Pass  http://a1pass.blog.163.com/

黑客反病毒论坛 http://bbs.hackav.com 

       昨夜看了论坛元老级人物 无锋之刃 的一篇文章《说C·指针》后受益匪浅,但是我却因此想到了更多,小弟学C时间不长,还要请各位看管多多指点斧正。
《说C·指针》总共分以下几个部分
1 指针是个什么东西................................1
2 指针的类型......................................1
3 指针的值域......................................4
4 指针的操作集....................................5

       对于 无锋之刃 前辈这篇文章我只想提出一点改善,改善在于“2 指针的类型”,这点我们马上就要讨论。

       我们先来看看 无锋之刃 前辈对于指针类型的定义:

       首先 无锋之刃 前辈提出“指针是受限关系不固定的类型。或者说指针是一种派生类型,从其它类型派
生而来(由完美废人于《TCPL》上看到),而且这种派生关系是由用户指定的。”

       从这里可以看出来先对指针做了一个正规的解释,即指针的类型是由用户指定的。
       随后, 无锋之刃 前辈便提出了一个颇具建树的观点“之所以说指针是一种派生类型,是有道理的。“*”号可以作为声明符,也可以作为派生符,用以描述指针和指向对象的类型之间的关系。如果把这种派生关系看作是一种限定,则也可以说指针是受限的整型类型(因其值域和运算操作都是整型值域和运算操作的子集),其限制的来源是指向对象的类型,而此类型由用户指定以体现受限关系。”
       从这里不难发现 无锋之刃 前辈对指针给出了“受限的整型类型”这么一个具有创意的指针类型定义。
       但是我认为如果将指针定义为数组类型的话将更有利于理解,下面请看我的观点。

       公认的指针定义:“指针就是一个值为其他内存地址的内存变量。
       如果我们非要强加给它一个类型的话,那么 无锋之刃 前辈提出的“受限的整型类型”从某种意义上来说也是正确的,因为内存地址不可能以现浮点数类型或布尔类型标识出来,但是我认为这并不完善。
       但是如果我们真的非要强加给指针一个类型的话,我更偏向于它是一个构造类型中的数组类型

       既然是数组类型,那么我们首先从数组出发,我定义了如下的一个数组:
       int a1pass[128];
       我们知道这是一个包含128个元素的数组,可以通过下标0-127来访问,例如现在我们可以通过类似于“a = a1pass[127];”的语句来访问最后一个元素。
       因此我们不难发现,数组是一种以下标为来访问的类型。

       现在我们再看看下面的语句:
       int i = 127;
       a1pass[i] = 10;
       我们很容易就能想到这两条语句其实等效于“a1pass[127] = 10;”,那么如果我们将它句换为如下语句呢?
       a1pass[1] = 127;
       a1pass[a1pass[1]] = 10;
       答案是仍然与“a1pass[127] = 10;”等效,OK!现在我们就来分析一下最后这两条语句:
       我们第一条语句将127存入元素a1pass[1]中,然后再将元素a1pass[1]作为下标供数组a1pass访问,最后决定将10存到哪个元素中。
       对于上面的两条语句各位看官有可能觉得比较奇怪,但是如果将其换为指针的话就好理解多了:
       int i = 127;
       int *a1pass_1 = &i;
       a1pass[*a1pass_1] = 10;
       由此可见,其实元素a1pass[1]就是个指针,虽然他们还是有一定的区别,但是不可否认的是元素a1pass[1]确实完成了一个指针的功能,如果将“元素a1pass[1]”替换为内存,并将数组a1pass的每个元都看作内存中的地址位置的话,那么这不就是指针了吗?

  评论这张
 
阅读(1929)| 评论(6)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018