2015年软件水平考试程序员之程序设计知识要点(18)
发布时间:2012/5/14 9:33:41 来源:城市网学院 编辑:ziteng
-
5.2 指针变量的应用1.指向变目的指针变量
当指针变量指向某个对象(它的值不是NULL)时,可以用
* 指针变量
引用指针变量所指向的对象。如语句:
ip=&i;
j=* ip;
实现将指针变量ip所指变量的内容(即变量i的内容)赋给变量j。此鱿脯赋位号右边的*ip 暗示引用中所指变量的内容。上述赋值等价于:
j=1;
语句
*ip=200;
实现向指针变量ip所指变量(即变量i)赋值200。此鱿脯赋值号左边的。ip暗示引用ip所指变量。上述赋值等价于
i=200;
一般地,记号“* 指针变量名”与指针变量所指变量的“变量名”等价。要出格注重:指针变量之间的赋值,指针变量所指向的变量之间的赋值,这两种赋质ё仝暗示体例上的区别。如语句
intpt=ip;
使两个指针变量intpt与ip指向统一个对象,或都不指向任何对象(如不美观ip的值为NULL)。而语句
* intpt=*ip;
实现将ip所指变量的值赋给intpt所指的变量。这里要求中与intpt的值都不成所以NULL。经由过程指针变量引用它所指的变量,现实引用哪一个变量,取决于指针变量的值。改变指针变量的值,就是改变了它的指向。指针变量最首要的应用有两个方面:一是让指针变量指向数组的元素,以便一一改变指针变量的指向,遍历数组的全数元素;二是让函数设置指针形式参数,让函数体中的代码经由过程指针形式参数引用挪用情形中的变量或函数。
为正确使用指针变量和它所指向的对象,特指出以下几点注重事项:
(1)指针变量界说与引用指针变量所指对象采用相似的标识表记标帜形式(* 指针变量名),但它们的浸染与意义是完全分歧的。在指针变量界说中(如int *ip;),指针变量名之前的符号“*”声名其随后的标识符是指针变量名。如不美观指针变量界说时带有初始化表达式,如
int i, * ip=&i;
初始化表达式的地址是赋给指针变量自己,而不是指针变量所指对象(现实上,在初始化之前,指针变量还未指向任何对象)。 [NextPage] (2)经由过程指向变量i的指针变量ip引用变量三与直接按其名i引用变量i ,效不美观是不异的,凡直接按名可引用处,也可以用指向它的某个指针变量借居引用它。若有
int i, *ip=&i;
则凡变量i能使用的处所,*ip一样能用。
(3)因单目运算符* 、&、++和--是从右向左连系的。要注重分清运算对象是指针变量、仍是指针变量所指对象。若有
int i,j,*ip=&i;
语句
j=++*ip;
是指 ip所指向的变量(变量i)的内容加1,加1后的值赋给变量j。也就是说,++*ip相当于++(*ip)。而语句j=*ip++;相当于语句j=*ip; ip++;这是因为先求值的是表达式 ip++,它的求值轨则是,表达式的值为原本ip的位,然后ip的内容增添了 1个单元。所以。 ip++的表达式值与*ip不异,并在*ip++求出表达式值的同时,指针变量ip增添了1个单元。这样,ip不再指向变量i,这种情形常用在指针指向数组元素的情形,在引用数组某元素之后,自动指向数组的下矣闽元素。而语句j=(*ip)++;则是先引用ip所指向的对象,取ip所指向的对象的内容赋给j,并让中所指向的对象的内容增添1个单元。
2.指向一维数组元素的指针变量
指针变量也能指向数组的元素。设有以下变量界说:
int a[100],*p;
赋质ё偎算p=&a[0]使p指向a[0]。暗示&a[0]还有更精练的体例,即数组名a。按商定,一维数组名表达式的值为数组存储区域的起头地址,即数组首元素的指针。对指向数组元素的指针许可作有限的运算。设有代码:
int *p,*q,a[100] ;
p=&a[10] ; q=&a[50] ;
(1)指向数组元素的指针可与整数进行加减运算。操作数组元素在内存中挨次持续存放的划定,和地址运算轨则,有表达式 a+1为 a[1] 的地址,a+2为 a[2]的地址。一般地,表达式a+i为a[i]的地址。把这个结论应用于指向数组元素的指针,同样地成立。若p的值为a[0]的地址,则表达式p+i的值为a[i]的地址。或者说,p+i的值为指向a[i]的指针值。若p指向数组元素 a[10],则 p+n就暗示指向数组元素 a[10+n],这里n是肆意的整数表达式。
一般地,当指针变量指向数组a的元素时,非论数组元素的类型是什么,指针和整数n进行加减运算时,老是按照所指元素的数据存储字节长度 sizeof a[0] ,对n放大,保证加减n,使指针植向前或向后移动n个元素位置。
(2)当两个指针指向统一个数组的元素时,许可两个指针作减法运算。其绝对值等于两指针所指数组元素之间相差的元素个数。如表达式&a[4O]-&a[0]的值为40。
(3)当两个指针指向统一个数组的元素时,这两个指针可以作关系斗劲(<,<=, ==,>,>=,!=)。若两指针p和q指向统一个数组的元素,则p==q为真暗示p,q指向数组的统一个元素;若p 操作运算符*可引用指针所指对象,*(a+i)暗示引用a+i所指向的数组元素a[i] 。这样。(a+i)就是 a[i]。对于指向数组元素的指针变量p,若p指向a[10],*(p+i)暗示引用p+i所指向的数组元素 a[10+i]。
与用数组名和下桥引用数组元素的标识表记标帜法相一致,指向数组元素的指针变量也可带下标引用数组的元素,即*(p+i)也可写成p[i] 。但若p=&a[10],则p[i]引用的是a[10+i],p[2]引用的是a[8]。
综上所述,引用数组元素有以下多种形式:
(1)用数组元素的下标引用数组元素,如 a[5]。
(2)操作数组名表达式的值是数组首元素指针的商定,可操作指针表达式借居引用数组元素,如*(a+i) 。
(3)操作指向数组元素的指针变量,用它组成指向数组元素的指针表达式,并用该表达式引用数组元素。如*(p+i)或p[i]。
这里要强调指出用数组名a表达数组元素指针与用指向数组元素的指针p来表达数组元素的指针,在现实应用上的区别:p是变量,其值可改变,如p++;而数组名a只代表数组a的首元素的指针,它是不成改变的,轨范只能把它作为常量使用。