gta5车原型:C语言问题

来源:百度文库 编辑:高考问答 时间:2024/05/02 16:02:41
以下程序运行后,输出结果是C
A) 1234567 B) 7654321 C) 1711717 D) 7177171
#inchude <stdio,h>
#inchude <string,h>
fun(char *w, int n)
{ char t, *s1,*s2;
s1=w: s2=w+n-1;
while(s1<s2)
{ t=*s1++;
*s1=*s2--;
*s2=t;
}
}
main()
{ char *p;
p="1234567";
fun(p,strlen(p));
puts(p);
}
能够给详细的说明下马?

这个主要是一个指针地址的操作问题。首先主函数不用说明了吧
main()
{ char *p; //申明一个指针
p="1234567"; //指针p指向这个字符串,现在p的地址就是在1那儿
fun(p,strlen(p)); //通过子函数运算
puts(p); //最后输出p
}
现在主要是看看子函数怎么计算的
fun(char *w, int n) //w就是p了,指向1那儿,n是p指向字符串的长度=7
{ char t, *s1,*s2; //申明一个字符变量t和两个指针变量s1,s2
s1=w; s2=w+n-1; //将w赋给s1,也就是说s1现在就指向1了
将w+6赋给s2,地址向后走6个字节,可以看到s2指向的字
符正是7
while(s1<s2) //s1的地址比s2小6,因此循环
{ t=*s1++; //把s1指向的1赋给t,即t等于1了,s1地址加1,现在s1指向2
*s1=*s2--; //把s2指向的7赋给s1,即s1指向的2被7覆盖掉,s2地址减1,
现在s2指向6
*s2=t; //把t的值1赋给s2,即s2指向的6被1覆盖掉
}
}
现在一个循环结束了,看看字符串的变化情况是:“1734517”
中间的345还没有操作到,再循环两次就得到C的结果了。
因为s1++,s2--,所以循环再进行两次就会结束,后面情况类推,不需要敖述了吧。

#inchude <stdio,h>
#inchude <string,h>
fun(char *w, int n)
{ char t, *s1,*s2;
s1=w: s2=w+n-1; //s1=第一个字符'1's2=最后一个字符'7'
while(s1<s2)
{ t=*s1++; //s1=s2交换
*s1=*s2--;
*s2=t;
}
}
main()
{ char *p;
p="1234567";
fun(p,strlen(p));
puts(p);
}

按照程序的意思结果应该是B

这个程序是个错误的很多错误
#inchude <stdio,h>
#inchude <string,h>
应该是
#include <stdio.h>
#include <string.h>

s1=w:
应该是
s1=w;

还有p="1233456"是不可以改变的,在交换的地方会出错

反正这题从题到答案没有对的地方

首先读懂程序,指针概念清楚是关键,其实这只是个非常简单的指针应用程序,注意:*s1++为取s1指向位置数据后再把s1向后移

对于这一段的执行过程

s1=w; s2=w+n-1;
while(s1<s2)
{ t=*s1++;
*s1=*s2--;
*s2=t;
}

顺序__t___s1位置__s2位置___w
开始______0_______6______1234567
1_____1___1_______5______1734517
2_____7___2_______4______1714717
3_____1___3_______3______1711717

楼上指出的前两处错误有道理,但p做为地址传递其内容是可以改变的,程序可以运行,答案是C,主要是考察指针的应用

如果选B则程序应改为:
while(s1<s2)
{ t=*s1;
*s1=*s2--;
*s2=t;
s1++;
}