定义指针变量仅说明了指针变量的名字及其所指向的变量的数据类型,在使用前还必须给指针变量赋值。由于指针变量的值为地址,因此给指针变量赋值应该是地址值。
如有以下定义:
int num,*pn;
char color,*pc;;
执行赋值语句:
pn=# pc=&color;
则将已定义的变量num的地址赋给指针pn,即将指针pn指向整型变量num,将已定义的字符变量color的地址赋给指针变量pc,即使指针pc指向字符型变量color。
必须注意的是,指针变量通常只能赋予编译程序为已定义的变量所分配的合法的地址,而不能将指针变量赋予任意一个地址。
按定义指针变量不能与普通变量相互赋值,下面的赋值语句都是非法的。
pn=num; 或 num=pn;
pc=color; 或 color=pc;
按照上述定义,在程序语句中,若要访问指针指向的目标变量,可将目标变量表示为:
* 指针变量名
例如:* pn=100; 等效于num=100;
* pc='r'; 等效于color='r';
这里“*”是间接访问目标变量的单目运算符,它与本节介绍的定义一个指针时,指针变量名前的指针定义符“*”的意义完全不同。
此外,指向同一种数据类型的指针变量之间可以相互赋值,即一个已赋值的指针变量可以赋给另一个指针变量。
例如:
int a,*pa,*pb;
pa=&a;
pb=pa;
将已赋值的指针变量pa赋给指针变量pb,即使指针pa和pb都指向同一个变量a,如图5.1.3所示。
图5.1.3 两个指针指向同一变量
与普通变量一样,指针变量在定义的同时也可赋初值。
例如:
int a,b,c;
int *pa=&a,*pc=&c;
表示将已定义的变量a、c的地址&a和&c作为初始值赋予指针变量pa和pc。
这里要注意,指针变量初始化,其初值只能是已定义变量的地址。
此外,还常把指针初始化为空指针。空指针并不是说指针的存储单元为空,而是给指针赋予一个特殊的值,即ASCII码值为0的字符NULL,空指针不表示任何指向,仅仅是指针的一种状态。
例如:
char*p=NULL;
这里定义指针p为空指针,空指针的概念与指针未赋值的概念完全不同。当指针变量未赋地址值时其值不确定,对这个地址的访问将得到错误结果。所以要特别注意在程序中使用指针变量前必须先赋地址值。
例如:
int*ptr,x,y;
ptr=&x;
x=1;
y=*ptr;
这里指针ptr被赋予x的地址,即指向x。变量y被赋予指针ptr所指向的目标变量x的值。
若将上面程序段改为:
int*ptr,x,y;
x=1;
y=*ptr;
由于指针变量ptr在使用前没有赋确定的地址值,对这个地址的访问将得到一个随机值。
又如:
int*ptr,x,y;
x=10;
*ptr=x;
y=*ptr;
这里,虽然可以得到y=10,但由于指针ptr没有赋变量x的地址值,并不指向变量x,若执行以下语句:
x=20;
y=*ptr;
则y值仍为10,而不是20。
还应指出的是:指针变量所指向的数据类型必须与定义指针时所规定的指针所指向的目标变量类型一致。
例如,有以下定义:
int *p,*q;
float x,y;
double z;
则下面的赋值语句都是错误的:
p=&x;
q=&z;
例5-1 指针赋值及对目标变量的访问。
程序如下:
例5-2 变量、变量地址、指针与指针地址的关系。
程序如下:
输出结果(地址为十六进制数):
程序第5行定义了整型变量u和v,并对u赋初值5。定义了指针变量pu和pv指向整型数据。
第7行将变量u的地址赋予指针pu,即让指针pu指向变量u。
第8行将指针pu所指向的目标变量*pu(即变量u)的值赋予变量v。
第9行将变量v的地址赋予指针pv,即使指针pv指向变量v。
在当时的运行环境中,C编译程序给变量u、v分配的地址分别为ffcc和ffce,给指针变量pu和pv分配的地址为ffd0和ffd2。
常见的编程错误5.1
将用于定于一个指针的*用于定义多个逗号分隔变量列表中的变量,例如"int*p1,p2,p3;"实际上只定义了一个指针变量p1而非三个。
良好的编程习惯5.1
在指针变量名中使用字符“ptr”,可以清楚地表明这些变量是指针,在程序中应该做适当的处理,从而避免语法错误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。