灵活运用指针变量的赋值和偏移
技术与开发
语言类型:C语言
上手难度:★★★★★
考试类型:计算机二级
题目:有以下程序,程序执行后的输出结果是( )。[2006年4月C语言选择题第37题]
答案:A
解析:首先从字符串“Program”中把字符g的地址取出来送给指针变量p,指针变量p指向字符数组a[]的第四个字符g,函数fun1中的指针变量q得到指针变量p的地址,也就指向了同一位置,循环遍历到字符数组结尾('\0'是字符数组结尾的标志),将每个字符的值+1。
注意:(*q)++是q所指的字符加1,q++就是指针移到下一个字符。
指针是C语言中广泛使用的一种数据类型。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能像汇编语言一样处理内存地址,掌握指针的运用可以编出精练而高效的程序。
指针是C语言的精华,但是指针也是C语言最难的知识点,是每年等级考试考生失分最多的地方,本期将详细讲解指针的难点。
一、指针和指针变量的区别
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。“指针”是指地址,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。
指针变量与其它的变量的同与不同:都是一个变量,都用来存储一个值;但是同样是变量,同样要占用一定大小的内存空间,不同的是普通变量在内存里,存储了一个具体的值;而指针变量存放的是另一个变量的地址。
二、通晓指针变量
1.指针变量的类型
其一般形式为: 类型说明符 *变量名;
staic int *p2; /*p2是指向静态整型变量的指针变量*/
float *p3; /*p3是指向浮点变量的指针变量*/
char *p4; /*p4是指向字符变量的指针变量*/
小提示:一个指针变量只能指向同类型的变量,如P3只能指向浮点变量,不能时而指向一个浮点变量, 时而又指向一个字符变量。
2.如何用指针变量赋值
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址, 不能赋予任何其它数据,否则将引起错误。C语言中提供了地址运算符&来表示变量的地址。
●用 & 取得普通变量的地址
要想让指针指向某个普通变量,需要通过 & 来得到该普通变量的地址。
int k;
int *p = &k;
●指针之间的赋值
两个指针之间也可以相互赋值,此时不需要通过 & 来取址。
p1 = &k; //p1 先指向 k
p2 = p1; // p2 也指向 k。
小提示:p2 = p1的结果是让p2也指向“p1所指的内容”,而不是让p2指向“p1本身”。
●让指针指向数组
数组本身就是地址,所以对数组变量也不用通过 & 来取址。
char name[] = "zenghongyun";
char *p = name; //不用取址符 &
小提示:想让指针变量存储一个数组的地址(或想让指针变量指向一个数组)时,不用取址符;解析一个指向数组的指针,得到的是数组的第一个元素。
3.偏移指针怎么用
对于指向数组的指针变量,可以加上或减去一个整数n。例如对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1(如图)。

读者反馈
小张:考试前买参考书有什么要求?
小编:考前许多学生都会买参考书,但市场上参考书琳琅满目、良莠不齐,有的参考书对试题的讲解比教材还啰嗦,这种书实用价值不大,浪费时间,另外有的参考书为了显示自己的“分量”,加大题目的难度,或者附很多习题但没有对答案进行讲解,都不是我们应选择的。我们选择参考书尽可能选择国家考试中心指定的教材,最好,最权威。