
浙江省计算机二级C语言的题目求过程详细解析,不要答案
#include <stdio.h>
main()
{ int i,j;
char ch, *p1, *p2, *s[4]={”tree”,“flower”,“grass”,“garden”};
for(i = 0; i < 4; i++) {
p2 = s[i];
p1 = p2 + i;
while(*p1 != ’\0’){
*p2 = *p1;
p1++, p2++;
}
*p2 = ’\0’;
}
for(i = 0; i < 4; i++)
printf("%s\n",s[i]);
}
【问题】
(21) 程序运行时,第1行输出 (21) 。
A、ree B、ss C、tree D、e
(22) 程序运行时,第2行输出 (22) 。
A、flower B、ower C、wer D、lower
(23) 程序运行时,第3行输出 (23) 。
A、grass B、ss C、rass D、ass
(24) 程序运行时,第4行输出 (24) 。
A、en B、arden C、den D、garden
这是2010年下半年的真题最后一道选择题 展开
我分析的答案是:CDDC。
首先要明白的是字符指针数组*s[4]它指向的是这四个字符串的首地址,
比如,S[0]存放的是第一字符串"tree"的首字符‘t’的地址,要明白的是在内存中
它们是这样存储的:
S[0]指向‘t’字符的首地址,也就是说S[0]存储的是字符‘t’的内存地址。但是不要
忘记了字符串最后面还会自动的加上字符串结束符‘\0’的。如果对于这块不明白的
还可以早C语言的书看看这一块的内容。
分析程序:
(1) i = 0; p2=S[0]; p1 = p2 + 0;
这里说明字符指针p1,p2都指向的是字符‘t’,*p1=*p2='t'。
执行while循环,循环条件满足,*p2=*p1,这里就是把*p1的值赋值给*p2,因为他们都是
指向字符‘t’所以不改变它的值。然后p1++,p2++,意味着p1、p2都指向下一个字符‘r’
仍然没有改变。依次类推下去p1、p2都指向字符‘\0’时while循环结束,接着执行
*p2=‘\0’,然而*p2本来就等于‘\0’,所以还是不变。
也就是说i = 0for循环结束一次循环,字符串“tree”没有改变。
(2) i = 1;p2=S[1]; p1 = p2 + 1;
执行while循环,第一次循环很明显的*p2 = *p1,因为*p1='l',所以*p2='l',也就是内存中‘f’就改变成了‘l’。执行p1++,p2++内存中的变化如下图:
类似的一次交换赋值,指针移动到下一位最终while循环结束。
还有一个很重要的地方需要提示一下,while循环结束但是*p2='\0'
,p2指向的值会被赋值为'\0'。p1 = p2 + i;p1指针的移动也要注意
p1到底是指向了那个字符。
C语言中,字符串中有‘\0’,则输出字符时它只会输出'\0'的前面字符。
比如:字符串“ass\0s\0”,则输出该字符串时结果为“ass”。
(3)i = 2 、3这里就不分析了,同上的分析思路。

2024-11-21 广告
不过按照原题的意思 输出应该是 0的时候出去全字符 1的时候从第二位即下表为1的字符开始输出到最后 2、3 依次类推。
因为p1在指向s[i]后 地址+i 赋值给p2 p2的地址就是每个字符串的地址。
中间这段话是有前提的,这段程序不成立
s改为2维数组即可
可以再详细些为我解释一下这个循环里的内容吗?比如说,i=0的时候,p2=s[0]等于什么,是tree吗?还有像p1要是+1了之后对字符串有什么改变?我想劳烦你以i=0时候为例,说下接下来每一句语句,谢谢
*s[4]={”tree”,“flower”,“grass”,“garden”};
s[0] : tree
s[1]: flower
..
s[3]: garden
i=0:
p2 = s[0];// p2: tree
p1 = p2 + 0; //p1 : tree
while(*p1 != ’\0’){
*p2 = *p1;
p1++, p2++;
}//这个循环就是吧p1中的内容赋值给p2 不详解
i=1:
p2 = s[1];// p2: flower
p1 = p2 + 1; //p1 : lower 因为p2的首地址指向的是 flower 中 f的位置 p2+1 就指向 l 的位置了
后面赋值
i=2,i=3 的时候和i=1的意思是一样的 每次地址向后位移 位移的量就是 i
不过这个程度的 p2 的值是不可用修改的 我前面说过了 你明白就行
中间操作跟 对s[4] 没影响.
楼下怎么看?