题记: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的每个元都看作内存中的地址位置的话,那么这不就是指针了吗?
评论