二级C语言试题讲解

认证攻关

指针(1)

指针是C语言区别于其他高级语言的主要特征之一。对指针的正确理解和灵活运用是成功进行C语言程序设计的关键环节。在计算机等级考试的二级C语言中,“指针”这一部分的内容是最为重要的,但由于指针的抽象性和灵活性往往使考生不知如何才能掌握好它的概念并运用概念解题。所以我们首先就来对指针进行讲解。

一、理论讲解

在本期的理论讲解中,我们将针对二级C语言考点之一的“指针变量基本概念”作详细的讲解。

1.指针变量的定义和初始化

指针在使用之前必须先定义其类型。

例如:int i,j,*p1=&i,*p2=&j;float x,y,*p3=&x,*p4=&y;

在示例中定义了整型指针变量p1、p2和实型指针变量p3、p4。需要注意的是:

(1) 指针变量类型应与所指向的数据类型一致,在这里p1和p2保存了变量i、j 的地址,而p3和p4保存了变量x、y的地址。

(2)指针变量本身是整型的,占两个字节。而与它所指向的数据类型无关。

(3)指针变量定义后,它并无实际意义,只有使指针变量指向某一对象,才有实际意义。也就是要将地址放入指针变量中,指针才能使用。将地址放入指针变量,称之为“指向”。

2.指针运算

指针的运算主要有算术运算和关系运算。

(1)两个重要的运算符,即&运算符和*运算符。

① 取地址运算符&:用来获得变量或数组元素的地址。

② 取内容运算符*:该运算符与地址量结合就称为目标变量,可获得地址量所指单元的内容。

*和&可以连用。它们是互逆运算符。

(2)指针的算术运算

①指针与整数的加、减运算

设p为指针变量并被赋于某个变量的地址后,与另一整数n可以进行如下运算:p±n。指针与一个整数相加、减的结果仍是一个地址量,表示把指针由当前指向的位置向后(地址增大)或向前(地址减小)移动n个位置。得到的新地址是p±n×字节数(数据长度)。其中字节数(数据长度)取决于指针所指向的数据类型。假如有以下定义:int a,*pa=&a,n=2;float b,*pb=&b;则pa+n表示向后移动4字节,而pb+n向后移动8字节。

② 指针的增1、减1运算

由于指针是一个变量,所以可以进行++p、p++或--p、p--运算。即指针的增1、减1运算也分为前置运算和后置运算,当它们和其它运算符出现在一个表达式中时,要注意它们之间的结合规则和运算顺序。特别是与取内容运算符*结合时要注意*和++、--属于同级运算,其结合规则是从右至左。

(3)指针的关系运算

具有相同数据类型的指针之间可以进行关系运算。指针变量不能与常数和其它变量进行关系运算,但任何类型的指针变量都可以和0进行关系运算以判断指针是否为空。例:设p为某种类型的指针变量,则p==0和p!=0就可用来判p为空还是不为空。

二、典型试题解析

例1:若有如下说明:int x=3,y=5,*p=&x;则能完成x=y赋值功能的语句是。

A. x=*p B. x=&y C. *p=*&y D. x=&*p

答案:C

例题分析:语句x=*p是将目标变量*p的内容赋给x,由于指针变量p已指向x,所以是将变量x的自身值3又赋给了x;语句x=&y是一个错误语句,&y表示y变量地址,不能将地址量赋给数值形变量x;在语句*p=*&y中,&y取出的是变量y的地址,而对地址量再用*作用后就可以取出地址量中的内容,所以*&y的结果就是y,将y的内容赋给目标变量*p,就完成了x=y的功能,因为指针变量p已指向x;语句x=&*p语句也是一个错误语句,&*p的结果是得到指针变量p中的地址,不能将地址量赋给数值型变量。

考察重点:此题要求考生掌握在指针变量中运算符&和*的使用规则及含义。

例2:设有如下说明和语句:

int a=5,b=3,c=7,x,y,z,*p=&a;

x=*p++;y=++*p;z=*++p;

printf("%d,%d,%d\n",x,y,z);

则输出结果是。

A. 5,3,7 B. 5,4,7 C. 6,6,3 D. 5,7,3

答案:B

例题分析:由定义中的*p=&a,可知指针变量p中存放了变量a的地址。语句x=*p++是将目标变量*p的内容(即a变量的内容)5赋给x后再将指针变量p的地址加1,使p指向变量b;而语句y=++*p则是将当前指针变量p所指的目标变量*p的值加1后再赋给y,由于p已经指向b变量,所以y得到的值是4;语句z=*++p是先将当前指针变量p所指的地址加1后使p指向变量c,再将目标变量*p的内容(即c变量的内容)7赋给z。

考察重点:该例题主要是让考生弄清楚在使用增1运算符“++”和减1运算符“--”的前置运算和后置运算与指针变量和目标变量的结合关系(减1运算符“--”的使用略)。