指针变量是存放地址的变量。和其他变量一样,必须在使用之前,加以定义说明。其定义说明的一般形式为
类型说明符*指针变量名;
例如:
int*P;说明指针变量P是指向int类型变量的指针。
char*s;说明指针变量s是指向char类型变量的指针。
float*f;说明指针变量f是指向float类型变量的指针。
Double*d;说明指针变量d是指向double类型变量的指针。
static int pa;说明指针变量pa是指向int类型变量的指针,而pa本身的存储类型是静态变量。
int*fpi();说明fpi()是一个函数,该函数返回指向int类型变量的指针。
Int(*pfi)();说明pfi是指向一个函数的指针,该函数返回int类型变量。指针变量值表达的是某个数据对象的地址,只允许取正的整数值。然而,不能因此将它
与整数类型变量相混淆。所有合法指针变量应当是非0值,如果某指针变量取0值,即为NULL,则表示该指针变量所指向的对象不存在。这是NULL在C语言中又一特殊用处。
2.指针运算符&和*
指针变量虽是正的整数值,但不是整数类型变量。指针变量最基本的运算符是&和*。
1)&——取地址。它的作用是返回后随变量(操作数)的内存地址。请注意,它只能用于一个具体的变量或数组元素,不可用于表达式。
例如:
这是将整数类型变量m的地址赋给整数类型的指针变量p
2)*——取值。它的作用是返回后随地址(指针变量所表达的地址值)中的变量值。
例:
这是将指针变量p所指向的整数类型变量(即m)的值赋给整数类型变量n。其结果与赋值语句m=n;一样,但操作过程用了指针变量p。
&与*运算符互为逆运算。对指针变量px指向的目标变量*px实行取址运算:
&(*px)
其结果就是px。对变量x的地址实行取值运算;
*(&x)
其结果就是x。
注意:x与*px同级别可写成x=*px或*px=x.px,与&x同级别可写成px=&x,但决不
可写成&x=px,也不能写成px=x。
3.指针的初始化和赋值运算
指针的初始化往往与指针的定义说明同时完成,初始化一般格式为
类型说明符 指针变量名=初始地址值;
例如:
char c;
char*charp=&c;
请注意:(www.xing528.com)
1)任何一个指针在使用之前必须加以定义说明;必须经过初始化;未经过初始化的指针变量禁止使用。
2)在说明语句中初始化,也是把初始地址值赋给指针变量,只有在说明语句中,才允许这样写。而在赋值语句中,变量的地址只能赋给指针变量本身。
3)指针变量初始化时,变量应当在前面说明过,才可使用&变量名作为指针变量的初始值。否则,编译时将出错。
4)必须以同类型数据的地址来进行指针初始化。指针变量可以进行赋值运算,这种赋值运算操作也仅限制在同类之间才可实现。
【例7-1】指针变量的引用。
【例7-2】指针变量的运算。
执行结果应显示
AA
BB
aa
4.sizeof运算符
sizeof运算符可以准确地得到在当前所使用的系统中某一数据类型所占字节数。sizeof运算的格式为
sizeof(类型说明符)
其值为该类型变量所占字节数。用输出语句可方便地打印出有关信息,例如:
5.指针的算术运算
指针的算术运算是按地址计算规则进行。由于地址计算与相应数据类型所占字节数有关,所以,指针的算术运算应考虑到指针所指向的数据类型。指针的算术运算只有如下4种:
+,-,++,--
1)指针自增1运算++和指针自减1运算--:指针自增运算意味着指针向后移动一个数据的位置,指向的地址为原来地址+sizeof(类型说明符)。例如:
int i,*p;
p=&i;
p++;
结果是p指向了变量i的地址+sizeof(int)。
2)指针变量的+和-运算:指针变量px加(+)正整数n,表示指针向后移过n个数据类型,使该指针所指向的地址变为原指向的地址+sizeof(类型说明符)*n。指针变量减(-)正整数n,表示指针往前移回n个数据,使该指针所指向的地址变为原指向的地址-sizeof(类型说明符)*n。
6.指针的关系运算
指向同一种数据类型的指针,才有可能进行各种关系运算。指针的关系运算符包括有:==,!=,<,,>=.
它们实际所进行的是两个指针所指向的地址的比较。不同类型指针之间的比较是没有意义的。指针与整数常量或变量的比较也没有意义。唯独常量0是例外的,一个指针变量为0(NULL)表示该指针指向空间不存在,称为空指针。如果有一个指针p,可以用p==0或p!=0来判断p是否为空指针。
7.使用指针编程中的常见错误
1)使用未初始化的指针变量,例如:
2)指针变量所指向的数据类型与其定义的类型不符,例如:
3)指针的错误赋值,例如:
错在以普通变量x赋给指针变量p。
4)用局部变量的地址去初始化静态的指针变量,例如:
用局部变量1oc1去初始化静态的指针变量1p是错误的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。