c语言中的指针专题(9页).doc
《c语言中的指针专题(9页).doc》由会员分享,可在线阅读,更多相关《c语言中的指针专题(9页).doc(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-c语言中的指针专题-第 9 页c语言中的指针专题2006-05-24 10:02:36来源: aspcool网友评论8条 论坛作者:anangcl一、数组的指针、指针数组以及指向指针的指针考虑数组的指针的时候我们要同时考虑类型和维数这两个属性。换一句话,就是说一个数组排除在其中存储的数值,那么可以用类型和维数来位置表示他的种类。A)一维数组在c和c+中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。例如:int a10; int *p; p=&a0/和p=a是等价的:因为a是数组名,所以他是该数组的地址,同时因为第一个
2、元素为a0,那么&a0也代表了该数组的地址。但是我们是不是就说一个数组名和该数组的第一个元素的&运算是一回事呢?在一维的时候当时是的,但是在高维的时候,我们要考虑到维数给数组带来的影响。a10是一个数组,a是数组名,它是一个包含10个int类型的数组类型,不是一般的指针变量噢!(虽然标准文档规定在c+中从int到int*直接转换是可以的,在使用的时候似乎在函数的参数为指针的时候,我们将该数组名赋值没有任何异样),a代表数组的首地址,在数字层面和a10的地址一样。这样我们就可以使用指针变量以及a来操作这个数组了。所以我们要注意以下问题:(1) pi和ai都是代表该数组的第i+1个元素;(2) p
3、+i和a+i代表了第i+1个元素的地址,所以我们也可以使用*(p+I)和*(a+I)来引用对象元素;(3)p+1不是对于指针数量上加一,而是表示从当前的位置跳过当前指针指向类型长度的空间,对于win32的int为4byte;B)多维数组对于二维数组a46;由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a00地址的数字是相同的,但是意义却是不同的。对于该数组我们可以理解为:a的一维数组(第一层),它有四个元素a0、a1、a2、a3(第二层),而每个元素又含有6个元素a00,a01,a02,a03,a04,a05(第三层),到此我们终于访问到了每个元素了,这个过程我们经历了:a-a0-
4、a00;整体来讲:a是一个4行5列的二维数组,a表示它指向的数组的首地址(第一个元素地址&a0),同时a0指向一行,它是这个行的名字(和该行的第一个元素的首地址相同(第一个元素为地址&a00)。所以从数字角度说:a、a0、&a00是相同的,但是他们所处的层次是不同的。既然a代表二维数组,那么a+i就表示它的第i+1个元素*(a+i)的地址,而在二维数组中*(a+i)又指向一个数组,*(a+i)+j表示这个数组的第j+1个元素的地址,所以要访问这个元素可以使用 *(*(a+i)+j)(也就是aij)。他们的示意图为(虚线代表不是实际存在的):对照这个图,如下的一些说法都是正确的(对于a46):
5、a是一个数组类型,*a指向一个数组; a+i指向一个数组; a、*a和&a00数值相同; ai+j和*(a+i)+j是同一个概念; 总结一下就是:我们对于二维指针a,他指向数组a0,1,2,3,使用*,可以使他降级到第二层次,这样*a就指向了第一个真正的数组。对于其他的情况我们也可以采用相同的方式,对于其他维数和类型的数组我们可以采用相类似的思想。说到指向数组的指针,我们还可以声明一个指针变量让它指向一个数组。例如:int (*p)5; 这时p就是一个指针,要指向一个含有5个int类型元素的数组,指向其他的就会出现问题。这个时候我们可以使用上面的什么东西来初始化呢?我们可以使用*a,*(a+1
6、),a2等。原因很简单:我们在一个二维的数组中,那么表达方式有上面的相互类似的意义呢?只有*a,*(a+1),a2等,C)指针数组一个指针数组是指一个数组中的每个元素都是一个指针,例如:int *p10;/而不能是int (*p)10 或者char *p10; 此时p是一个指针(数值上和&p0一样);在前面有int t10;int * pt=t;/使用pt指向t 那么这里我们用什么指向int *t10中的t呢?我们要使用一个指针的指针:int *pt=t; 这是因为:在int *t10中,每个元素是指针,那么同时t又指向这个数组,数组上和&t0相同,也就是指向t0,指向一个指针变量,可以说是一
7、个指针的指针了,所以自然要用int *pt; D)指针的指针一个指针变量内部可以存储一个值,这个值是另外一个对象的地址,所以我们说一个指针变量可以指向一个普通变量,同样这个指针变量也有一个地址,也就是说有一个东西可以指向这个指针变量,然后再通过这个指针变量指向这个对象。那么如何来指向这个指针变量呢?由于指针变量本身已经是一个指针了(右值),那么我们这里就不能用一般的指针了,需要在指针上体现出来这些特点,我们需要定义指针的指针(二重指针)。int *p1=&i; int*p2=&p1; 综合以上的所有点,下面是我们常常看到一些匹配(也是经常出错的地方):int a3,b23,c,*d3; voi
8、d fun1(int *p); void fun2(int (*p)3); void fun3(int *p); void fun4(int p3); void fun5(int p); void fun6(int p23); void fun7(int (&p)3); 函数 不会产生编译时刻的可能值(但逻辑上不一定都对)函数不会产生编译时刻的可能值(但逻辑上不一定都对)fun1a, &ai, *b ,bi,&bij ,&c ,difun2b,b+i,fun3dfun4a, &ai, *b ,bi,&bij ,&c ,difun5a, &ai, *b ,bi,&bij ,&c ,difun6b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 中的 指针 专题
限制150内