当前位置:文档之家› 指针典型例题分析与解答

指针典型例题分析与解答

指针典型例题分析与解答1 对于变量x,其地址可以写成________;对于数组y[10],其首地址可以写成________或__________;对于数组元素y[3],其地址可以写成__________或_________。

【分析】变量的地址可以写成“&变量名”。

数组的首地址就是数组名,也可以写成第 1个元素的地址“&数组名[0]”。

数组元素的地址可以写成“&数组元素”,也可以写成“数组首地址十下标”。

【答案】&xy&y[0]&y[3]y+32 设有定义语句“int k,*p1=&k,*p2;”,能完成表达式“p2=&k”功能的表达式可以写成_______________。

【分析】注意原来表达式“p2=&k”的主要功能是将变量k的地址存放到指针变量p2中。

现在变量k的地址已经存放在指针变量pl中,所以完成“p2=&k”功能的表达式是:p2=p1.【答案】p2=p13 设有两条语句“int a,*p=&a;”和“*p= a;”,则下列说法中正确的是()①两条语句中的“*p”含义完全相同②两条语句中的“*p=&a”和“*p=a”功能完全相同③第 1条语句中的“*p=&a”是定义指针变量 p并对其初始化④第2条语句中的“*p=a”是将a的值赋予变量p【分析】分析备选答案①:第1条语句是数据定义语句,其中的“*p”表示定义的变量p是指针型变量;第2条语句是赋值语句,其中的“*p”代表它所指向的变量a,所以该备选答案是错误的,不符合题意。

分析备选答案②:第 1条语句中的“*p=&a”是将变量 a的地址以初值方式赋予指针变量 p;而第 2条语句中的“*p=a”是将变量 a中的值赋予指针变量 P指向的变量(注意也是 a,即该语句的作用和 a = a完全相同),显然该备选答案是错误的,不符合题意。

再分析备选答案③:显然该答案是正确的,符合题意。

至于备选答案④,显然是错误的“*p”是代表指针变量p指向的变量,不能代表指针变量p。

【答案】③4 设有定义语句“ int x,*p= &x;”,则下列表达式中错误的是()①*&x②&*x ③*&p④&*p【分析】注意“*”和“&”运算将是同一优先级别的,结合性是自有向左。

接着来分报备选答案①:&x 代表变量x的地址,*(&x)代表“&x”地址对应的变量,即变量X,一股说“*&变量”就是该变量,所以该答案是正确的,不符合题意。

备选答案②中的“*x”是错误的,因为x是普通变量,不是指针型变量,而运算符“*”的运算对象必须是地址,所以该答案符合题意。

显然备选答案③和④都是正确的。

我们来分析一下。

备选答案③的格式属于“*&变量”,所以其结果为指针型变量p,是正确的。

备选答案④中的“*P”代表指针变量P指向的变量x,(*p)代表变量X的地址,也是正确的。

一般说“&*指针变量”,则代表指针变量指向的变量的址。

【答案】②5 设有定义语句“float s[10],*p1=s,*p2=s+5;”,下列表达式中错误的是()① p1= 0xffff ② p2--③ p1-p2 ④ p1<=p2【分析】当两个指针变量指向同一个数组时,每个针变量都可以进行增 l、减 1运算,两个指针变量之间可以进行减法运算和关系运算。

显然备选答案②、③。

④是正确的,不符合题意,只有备选答案①才是错误的,符合题意。

对备选答案①的分析也很简单,因为C语言规定,所以的地址表达式中,不允许使用具体的整数来表示地址。

【答案】①6 有下列定义语句“char s[]={"12345"},*p=s;”,下列表达式中错误的是()①*(p+2)②*(s+2) ③ p="ABC" ④ s="ABC"【分析】分析备选答案①:指针变量p已经指向数组s首地址,则p+2代表数组元素s[2]的地址,*(p +2)就是代表数组元素s[2],所以是正确的,不符合题意。

分析备选答案②:s是数组名,代表数组首地址,s+ 2代表数组元素 a[2]的地址,*(S+ 2)代表数组元素s[2],和备选答案①一样,也不符合题意。

分析备选答案③:C语言规定,在程序中可以使用赋值运算符将字符串常量直接赋予字符型指针变量,所以该备选答案也是正确的,不符合题意。

只有备选答案④是错误的,符合题意。

原因是C语言规定,在程序中不允许将字符串常量以赋值语句方式直接赋予字符型数组。

【答案】④7 设有语句“float x[4][10],*p=x;”,则下列表达式中不属于合法地址的表达式是()①&x[1][2]②*(p+1* 10+2)③x[1]④ p+1* 10+2[分析]分析备选答案①:x[1][2]是合法的数组元素,所以“&x[1][2]”表示数组元素 x[l][2]的地址。

分析备选答案②:由于指针变量指向二维数组首地址,“*(指针变量十行下标*列长度十列下标)”是表示数组元素“数组名[行下标][列下标]”的,不表示地址,所以该答案符合题意。

至于备选答案③,x[l]代表数组 X中行下标为 1的所有元素组成的一维数组名,即该一维数组的首地址,所以是一个地址表达式。

备选答案④中的表达式是代表数组元素x[1][2]的地址的,具体分析可以参看上面备选答案②中的分析。

【答案】②8 设有定义语句“double d[3][5]= {{1},{2},{3}},(*p)[5]=d;”,则下列表达式中值不为0.0的表达式是()①*&d[1][2] ②p[1][2]③*(p+1*5+2)④*(*(p+l)+2)【分析】首先看看数组d中各元素的初值,显然d[0][0]的初值为1.0、d[l][0]的初值为2.0.d[2][0]的初值为3.0,其余元素的初值均为0.0。

接着分析备选答案①:*&d[1][2]就是d[l][2],所以其值为0.0,不符合题意。

分析备选答案②:p[1][2]就是d[1][2],显然其值为 0.0,不符合题意。

再分析备选答案③:该表达式运算后的结果相当于*(p+7),由于指针变量p是指向长度为5的一维数组的,所以,这个表达式代表地址,其值不是0.0,符合题意。

显然备选答案④中表达式的值为0.0 ;因为该表达式相当于数组元素d[1][2]。

【答案】③9 设有定义语句“char s[3][20],(*p)[20]=s;”,则下列语句中错误的是()① scanf("%s", s[2]);② gets(*(p+2));③ scanf("%s",(p+2)+0);④ gets(s[2][0]);【分析】分析备选答案①、③,都是通过scanf()函数输入一个字符串,该函数中的第2个参数要求是地址。

备选答案①中的S[2]是一个地址,表示输入的字符串存人字符数组s的第2行,所以是正确的。

由于指针变量p是指向长度为20的一维数组,所以备选答案③中的*(p+2)+0相当于s[2][0] 的地址,也是正确的。

备选答案②、④是通过gets()输入字符串的,该函数的参数也是地址。

分析备选答案②中的*(p+2)字符数组s的第2行组成的一维数组的首地址,所以是正确的。

备选答案④中的s[2][0]是数组元素,不是地址,所以是错误的。

【答案】④10 设有下列程序段,该程序段输出的结果是int k[2]={5,4},*P[2];p[o]=k,p[l]=k+l;prinif("%d",*p[1]);【分析】从定义语句中可以看出,p是一个指针型数组,共有两个数组元素:p[0]和p[1]。

两个赋值表达式组成的逗号表达式使得p[0]指向整型数组元素k[0],其值为5;p[1]指向整型元素 k[l],其值为4。

输出语句中的输出表达式“*P[1]”是代表指针数组元素p[l]指向的整型数组元素k[1]的,其值为4。

【答案】 411 设有下列定义语句,则表达式“**p2”的值是_______________,表达式“*(*p2+l)”的值是_________________。

int x[3]={1,2,3},*p1= x,**p2=&p1;【分析】从定义语句中可以看出,pl是指向整型数组 X首地址的一级指针变量,p2是指向一级指针变量pl的二级指针变量。

从运算符“*”的结合性是自右向左的来看,表达式**p2相当于肝*(*p2),*p2相当于p1,所以**p2相当于*pl,由于一级指针变量p1指向的是数组X的首地址,即x[0]的地址,所以其值为x[0]的值,等于1。

第2个表达式*(*p2+1)相当于*(p1+1),而pl+l相当于数组元素x[1]的地址,所以该表达式的值就是数组元素x[1]的值,等于2.【答案】 1212 设有下列程序,假定该程序运行后的输出是:234。

请填写程序中缺少的语句成份。

main(){ char *p="12345678";while(____________){ printf("%c",*p+1);p++;}}【分析】从数据定义语句中看出,字符型指针变量指向字符串"12345678",即指针变量p指向第1个字符'l'。

由于程序所缺少的是控制循环的条件,假定第1次执行循环体时条件成立,输出的结果是"*p+1",即是指向字符'l'的,'1'+1的结果是字符'2',输出结果为2,与题目要求一致,然后执行p++,使p指向第2个字符'2'。

显然第2次执行循环体输出结果为字符'3',符合题目要求。

第3次执行循环体输出字符是'4',也符合题目要求。

注意此时p已经指向字符串中的第4个字符'4',显然不能再执行循环体了,否则将输出字符'5'。

可以看出,所缺少的控制循环条件是当p指向字符串中第4个字符'4'时必须退出循环。

这个条件很容易写成“p指向的字符不是'4'”。

具体来说,这个条件表达式可以写成“*p!='4'”,也可以写成“*p<'4'”或者“*p<='3'”等等。

【答案】*p='4'或者*p<'4'或者即*p<='3'13 下列程序的功能是输入一个字符串存入字符数组a中,然后将其中的所有字符'\ DOWN'删除后再存入字符数组b,最后将字符数组b中的字符串输出。

请填写程序中缺少的语句。

#include”string.h”main(){ char a[81],b[8l],*p1=a,*p2=b;gets(p1);while(*p1='\0')if(*p1==‘\\')___________________else*p2++=*p1++;puts(b);}【分析】程序中的当型循环是完成删除数组a中存放的字符串中字符'\'的,分析控制这个循环的条件可知,这是依次处理存放在字符数组a中每个字符的标准程序段。

相关主题