指针变量定义,说明了指针变量的名字及其所指向的变量的数据类型。使用指针变量前还必须确定指针变量所指向的目标变量。由于指针变量的值为地址,因此对指针变量赋值应该是目标变量的地址值。
如有定义:
int num,*pn;
char color,*pc;
赋值语句:
pn=#
pc=&color;
将已定义的变量num的地址赋予指针pn,即将指针pn指向整型变量num,将已定义的字符变量color的地址赋予指针变量pc,使指针pc指向字符型变量color。
必须注意的是,指针变量通常只能赋予编译程序为已定义的变量所分配的合法的地址,而不能将指针变量赋予任意一个地址。以下语句非法:
scanf(“%d”,pn);
pn=2000;
pn=0XFED8u;
指针变量不能与普通变量相互赋值,下面的赋值语句都是非法的:
pn=num; 或 num=pn;
pc=color; 或 color=pc;
若要访问指针指向的目标变量,可将目标变量表示为
*指针变量名
其中,*是间接访问目标变量的单目运算符,它与定义指针使用的指针说明符*的意义不同。
*与指针作为一个整体,代表指针指向的目标变量,而不是目标变量的值。
例如:*pn代表了变量num;
而
*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;
空指针的概念与指针未赋值的概念不同。当指针变量未赋地址值时,指向的目标不确定,对目标单元进行访问可能导致不可预见的结果。例如:
int *pt r,x,y;
ptr=&x;
x=1;
y=*ptr;
指针ptr被赋予x的地址,即指向x。变量y被赋予指针pt r所指向的目标变量x的值。
若将上面程序段改为
int *pt r,x,y;
x=1;
y=*ptr;
由于指针变量ptr在使用前没有赋确定的地址值,对这个地址所代表单元的访问将得到一个随机值或出现运行错误。
应该指出的是:指针变量所指向的数据类型必须与定义指针时所规定的指针所指向的目标变量类型一致。
例如,有
int *p, *q;
float x,y;
double z;
则下面的赋值语句都是错误的:
p=&x;
q=&z;
例5-1 指针赋值及对目标变量的访问。
参考程序为
程序运行结果:
b=100
例5-2 变量、变量地址、指针与指针地址的关系。
参考程序为
输出结果(地址为十六进制数):
u=5 &u=ffcc pu=ffcc *pu=5 &pu=ffd0
v=5 &v=ffce pv=ffce *pv=5 &pv=ffd2
第5行定义了整型变量u和v,并对u赋初值5。定义了指针变量pu和pv指向整型数据。
第7行将变量u的地址赋予指针pu,即让指针pu指向变量u。
第8行将指针pu所指向的目标变量*pu(即变量u)的值赋予变量v。
第9行将变量v的地址赋予指针pv,即使指针pv指向变量v。
在当时的运行环境中,对变量u、v分配的地址分别为ffcc和ffce,对指针变量pu和pv分配的地址为ffd0和ffd2。
常见的编程错误5.1
●"int *p1,p2,p3;"实际上只定义了一个指针变量p1,而不是三个指针变量。p2和p3是整型变量。
良好的编程习惯5.1
●在指针变量名中使用前缀ptr或pt,可以清楚地表明变量是指针。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。