收藏 分享(赏)

指针典型例题分析与解答.docx

上传人:dcs1276 文档编号:6565632 上传时间:2019-04-17 格式:DOCX 页数:8 大小:20.65KB
下载 相关 举报
指针典型例题分析与解答.docx_第1页
第1页 / 共8页
指针典型例题分析与解答.docx_第2页
第2页 / 共8页
指针典型例题分析与解答.docx_第3页
第3页 / 共8页
指针典型例题分析与解答.docx_第4页
第4页 / 共8页
指针典型例题分析与解答.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、指针典型例题分析与解答1 对于变量 x,其地址可以写成_;对于数组 y10,其首地址可以写成_或_;对于数组元素 y3,其地址可以写成_或_。【分析】变量的地址可以写成“变量名”。数组的首地址就是数组名,也可以写成第 1 个元素的地址“数组名0”。数组元素的地址可以写成“数组元素”,也可以写成“数组首地址十下标”。【 答案】 xyy0y3y32 设有定义语句“int k,*p1k,*p2;”,能完成表达式“p2k”功能的表达式可以写成_。【分析】注意原来表达式“p2k”的主要功能是将变量 k的地址存放到指针变量 p2中。现在变量 k的地址已经存放在指针变量 pl中,所以完成“p2k”功能的表达

2、式是:p2p1.【答案】p2p13 设有两条语句“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;

3、而第 2条语句中的“*p=a”是将变量 a 中的值赋予指针变量 P 指向的变量(注意也是 a,即该语句的作用和 a a 完全相同),显然该备选答案是错误的,不符合题意。再分析备选答案:显然该答案是正确的,符合题意。至于备选答案,显然是错误的“*p”是代表指针变量 p指向的变量,不能代表指针变量 p。【答案】4 设有定义语句“ int x,*p= x;”,则下列表达式中错误的是()*因为该表达式相当于数组元素 d12。【答案】 9 设有定义语句“char s320,(*p)20s;”,则下列语句中错误的是() scanf(“%s“, s2); gets(*(p2); scanf(“%s“,(p2

4、)0); gets(s20);【分析】分析备选答案、,都是通过 scanf()函数输入一个字符串,该函数中的第 2个参数要求是地址。备选答案中的 S2是一个地址,表示输入的字符串存人字符数组 s的第 2行,所以是正确的。由于指针变量 p是指向长度为 20的一维数组,所以备选答案中的*(p2)0 相当于 s20 的地址,也是正确的。备选答案、是通过 gets()输入字符串的,该函数的参数也是地址。分析备选答案中的*(p2)字符数组 s的第 2行组成的一维数组的首地址,所以是正确的。备选答案中的 s20是数组元素,不是地址,所以是错误的。【答案】 10 设有下列程序段,该程序段输出的结果是int

5、k25,4,*P2;pok,plkl;prinif(“%d“,*p1);【分析】从定义语句中可以看出,p 是一个指针型数组,共有两个数组元素:p0和 p1。两个赋值表达式组成的逗号表达式使得 p0指向整型数组元素 k0,其值为 5;p1指向整型元素 kl,其值为 4。输出语句中的输出表达式“*P1”是代表指针数组元素 pl指向的整型数组元素 k1的,其值为 4。【答案】 411 设有下列定义语句,则表达式“*p2”的值是_,表达式“*(*p2+l)”的值是_。int x31,2,3,*p1 x,*p2=或者 p1=p1+1;14 阅读下列程序,写出程序运行的输出结果。main() char a

6、20=”1A2B3C”,b20,*p1=a,*p2=b;doif (!(*p1O &*p1=9)*p2=*p1;p2;*p2*p1;else*p2=*p1;p1,p2;while(*p1=0);*p2=*p1;printf(” sn”, b);【分析】首先搞清楚数据定义语句中数组 a和指针变量 p1 和 p2 的初值。程序的第 1 条语句 j 是 do-while语句。控制该循环的条件是“*p10”,即当前指针变量 p1 指向的字符不是字符串结束标记,则进行循环。考虑到循环体中有 p1,显然这个循环是利用指针变量 p1来依次处理存放在数组 a中的字符串中每个字符的标准程序段。现在来看循环体,循

7、环体中前一条语句是双分支语句,其控制条件“!(*p0*pl9)”的含义是当前字符不是数字字符。当这个条件成立时,执行三条语句:第 1条赋值语句是将 p1指向的当前字符复制到 p2指向的数组 b中;第 2条语句是修改指针变量 p2(加1),使其指向后一个位置;第 3条赋值语句和第 1条赋值语句完全相同,即把 p1指向的当前字符再次复制到 p2指向的数组 b的当前位置上。显然是将p1指向的字符复制两次到 p2指向的数组 b 中。这个双分支语句的条件不成立时,执行“*p2=*p1”是将当前字符复制到数组 b中,仅复制 1次。循环体的第 2条语句是逗号表达式构成的语句,其功能是修改pl和 p2(加 1

8、),使其分别指向数组。和数组 b的后一个位置。退出循环后执行的“*p2=*p1”是将数组a中当前字符(0)复制到数组 b中,即给数组 b中增加一个字符串结束标记,以便组成字符串。最后一条语句是输出数组 b中的字符串。综合上述分析,可以得出关于程序功能的下列结论:将存放在数组 a中的字符串复制到数组 b中,复制的规则如下:当前字符是数字字符,则该字符仅复制 l次;当前字符不是数字字符,则当前字符要复制两次。因此,很容易直接写出程序运行的输出结果。【答案】1AA2BB3CC15 阅读下列程序,写出程序运行的输出结果。main() int x10=1,7,4,3,5,*p,*q, i;for(pqx

9、,10;i10;i,p)if(*q*p)qp;printf(”dn”,qx);【分析】首先分析数据定义语句中数组 x各个元素的初值,依次为 1、7、4、35、0、0。下面用记录各个变量值的方式来获得最终输出结果,记录如下:p指向 x0,q 指向 x0,i0,条件“i10”满足,进入循环体第 1 次执行循环体:*q=1,*p=1,条件“*q*p”不成立,不执行 qp;执行 i,i 1;执行 p,p 指向 x1,继续循环。第 2次执行循环体:*q=1,*p=7,条件“*q*p”成立,执行 qP,q 指向 x1,执行 i, i2;执行 p,p 指向 x2,继续循环。第 3次执行循环体:*q=7, *

10、p 4,条件“*q*p”不成立,不执行 qp;执行 i,i3;执行p,p 指向 x3,继续循环。第 4次执行循环体:*q= 7,*p= 3,条件“*q*p”不成立,不执行 q p;执行 i, i 4;执行 p,p 指向 x4,继续循环。第 5次执行循环体:*q=7,*p=5,条件“*q*p”不成立,不执行 qp;执行 i,i5;执行p,p 指向 x5,继续循环。第 6次执行循环体:*q=7,*p=0,条件“*q*p”不成立,不执行 qp;执行 i,i= 6;执行 p,p 指向 x6,继续循环。第 7 次执行循环体:*q=7,*p=0,条件“*q*p”不成立,不执行 qp;执行 i,i 7;执行

11、 p,p 指向 x7,继续循环。第 10 次执行循环体:*q= 7,*p=0,条件“*q *p”不成立,不执行 qp;执行 i, i 10;执行 p, p 指向 x 10。此时,控制循环的条件“i10”不成立,退出循环。执行输出语句,输出结果是 qx,由于指针变量 q指向 x1,而 x是数组首地址,代表数组元素 x0的地址,所以 qx 的值是整数 1。注意,本程序输出的实际上是教组 x中最大值的下标。【答案】 116 阅读下列程序,写出程序的主要功能。 include”stringh”main() char s581,*pl5,*p2,*p3;int i;for( i 0; i 5; i) p

12、1 s0;gets( p1);for( p3 p2 p1, i 0; i 5; i, p2)if( strcmp( *p3,*p2) 0) p3 p2;puts( *p3);【 分析 】 从数据定义语句可知,定义了一个二维字符型数组 s和一个一级指针数组 p1、两个二级指针变量 p2、 p3。接下来的单重次数型循环执行 5次,循环体中的第 1条语句是将二维数组中的第 i行首地址存入指针数组元素 p1中,第 2条语句是输入一个字符串存入 p所指向的字符数组中第 i个一维数组中。也就是说,输入的 5个数组存放在二维数组 s的 5行中,同时,指针数组 p1的 5个元素分别指向这 5个字符串。第 2个

13、循环语句也是循环 5次的次数型循环。循环的开始,先让二级指针变量 p2和 p3都指向一级指针数组首地址,即 p2指向 pl0(注意 *p2就是 pl0), p3指向 p10(注意 *p3就是 pl0)。循环体中利用函数 strcmp()来比较 *p2(第 1次循环时 *p2等于 p10)和 *p3(第 1次循环时等于 pl【0 )指向的字符串的大小。如果 *p3指向的字符串比 *p2指向的字符串小,则将 p2存入 p3中保存。这个工作显然是用 p3来保存 5个字符串中最大字符串的地址。最后的输出语句是输出 *p3所指向的字符串。综上所述,本程序的功能很容易总结出来。分析本程序时,要注意 p2和

14、 p3是二级指针变量,它们的初值等于一级指针数组 p1的数组名,即这两个二级指针变量是指向一级指针数组元素 pl0的。此时, *p2和 *p3都等于 pl0,而 pl0是指针数组元素,其中存放的地址是字符型二维数组 s中第 0行第 0列元素的地址,即 s00的地址。如果当作字符率来理解的话, p10是指向从 s00开始存放的字符串。【 答案 】 输入 5个字符串,输出其中最大的字符串。17 编一个程序,取出一个字符串的左边 n个字符组成新的字符率并输出。原字符率及 n从键盘输入。本题要求用指向字符的指针来处理字符率中的字符。【 分析 】 取出某个字符串左边 n个字符的算法是一个次数型循环结构,

15、可以使用 for循环来实现次数型循环结构,用指针变量来处理具体的单个字符。【 答案 】 include“string h“main() char al00, b100, *p_a a, *p_b b;int n, i;gets( p_a);scanf( “%d“, n);for( i=0; i n; i)*( p_b i) *( p_a i);*( p_b i) 0;puts( p b);18 编一个程序,从键盘上输入一串符号(以回车换行键为结束),将其以字符率形式存入一维字符型数组,然后再输出该字符型数组中的字符串。本题要求用指向字符的指针来处理字符型数组中的字符。【 分析 】 本程序的结构可以这样来设计,输入一个字符,如果是回车换行符,则结束输入,否则存入某字符型数组。反复进行直到输入的字符是回车换行符,这段程序是标准的当型循环结构。输入结束后,在字符数组的当前位置上(最后一个有效字符之后)置一个字符串结束标记。【 答案 】main () char s100, *p=s, ch;scanf( “%c“, ch);while( ch! n) *p=ch;p;scanf( “%c“, ch);*p 0;p=s;printf( “%sn”, p);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报