C语言问题。。谁来帮忙解答下啊。

(25)有以下程序
#include<stdio.h>
void fun(char *s)
{while(*s)
{ if(*s%2==0) printf(“%c”,*s);
s++;
}
}
main()
{ char a[]={“good”};
fun(a);printf(“\n”);
}
注意:字母a的ASCⅡ码值为97,程序运行后的输出结果是
A)d B)go C)god D)good
(26)有以下程序
#include <stdio.h>
void fun( int *a,int *b)
{int *c;
c=a;a=b;b=c;
}
main()
{int x=3,y-5,*P=&x,*q=&y;
fun(p,q);printf(“%d,%d,”,*p,*q);
fun(&x,&y);printf(“%d,%d\n”,*p,*q);
}
程序运行后的输出结果是
A)3,5,5,3 B)3,5,3,5 C)5,3,3,5 D)5,3,5,3
答案是 A和B

之前2级考试的题目。我只在网上下到了题目答案 但是不能理解。我认为应该是B和C 请哪位强人 来提点提点我啊。·

回答问题1:

你有编译器吗?肯定有吧,那把下面的代码运行遍。代码的运行结果见附图。

#include<stdio.h>

#include <windows.h>

void fun(char  *s)

{

 while(*s)

 { 

  char ch='s';

  printf("%c进来了,它的ASCII码为%d\n",*s,*s);

  system("pause");

  if(*s%2==0) 

  {

   printf("%c",*s);

  }

  s++;

 }

}

void main()

 char  a[]={"good"};

 fun(a);

 printf("\n");

 system("pause");

}

回答问题2:

说实话,当初我的指针也学得混混沌沌,所以不敢保证我的解释正确的。

首先进入源程序的定义:

int x=3,y=5,*p=&x,*q=&y;

即指针p指向x的地址,y指向q的地址,我们假设p=0000001h这个地址

同理,我们假设p=0000002h这个地址。

然后调用fun函数

void fun ( int *a,int *b)

{

 int *c;

 c=a;a=b;b=c;

}

这个函数的功能是交换a指针与b指针的值

由上假设知道a=0000001h,b=0000002h

那么交换后a=0000002h,b=0000001h

也许你的疑惑就在这里了,为啥a的指针与b的指针值交换了输出结果却不交换呢?

因为在执行这个函数的时候是这样执行的,如下语句,我翻译一遍。

a=p;

b=q;

然后交换a,b的值

则b=p ,a=q

这里交换的确成功了,但是我们别被它误导了,这里只是a,b的值交换了,

p和q的值可是没变的!!!!!

那么我举个例子

#include <stdio.h>

void fun(int a,int b)

{

 //交换

 int c=a;

 a=b;

 b=c;

}

void main()

{

 int x=1,y=2;

 fun(x,y);

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

}

你会发现,虽然fun函数中的a,b是交换了值,但是x,y其实根本是没变的。

这个跟上面的题目应该是一个道理。

同样的fun(&x,&y); 

&x=p;

&y=q;

同理。

温馨提示:内容为网友见解,仅供参考
第1个回答  2009-07-01
第一个题函数的作用是:如果该字符的ASCII码是偶数,就打印出来。
if(*s%2==0) printf(“%c”,*s);
d的ASCII码是100.g的ASCII码是103.o的ASCII码是111.
所以只打印d。所以选a。
第二题:
要理解参数传递的机制。我给你大体说一下吧。
当参数传递的时候,会自动创建实参的副本传入函数,注意传进去的是副本而并非实参本身,无论你参数是值还是指针。对于这个题目,它改变的是p,q的副本的值。p,q并没有改变,所以p,q所指的内容没变。所以打印的还是3,5.
lz一定明白下面这个程序不能起到交换值的作用。其实这个和下面的是一个道理。
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
}
如果做到交换值,要这么写:
void fun( int *a,int *b)
{int *c;
*c=a;*a=*b;*b=*c;
}
这时候还是一样,p和q传进去副本,但是它们所指的内容和p,q所指的内容占用的是同一块内存。这句话*c=a;*a=*b;*b=*c;这句话,副本p和q改变了这块内存的值,相应的main函数中的p和q指向的值也就变了。本回答被提问者采纳
第2个回答  2009-07-01
第1道题:
可以看出fun函数的作用是输出字符串中ASCII码为偶数的字母,a是97,在字母表中排1,所以该函数其实就是输出字母表中排名偶数的字母,g为7,o为15,d为4,所以应该输出为d
第2道题:
fun(p,q)中p和q传的是形参而不是实参所以x=3和y=5并没有交换,fun(&x,&y)也是一样的,fun函数的作用是交换两个传入的指针变量的值,但由于是值传递,所以实参指针的值并未发生改变。如果fun函数里面写成c=a,*a=*b,*b=*c,那么没执行一次,实参指针指向的值就改变了。

另外给你个建议,有了题目为什么不自己装环境验证呢,很简单的事情啊。要只是为了过二级就没必要太过关注了。
第3个回答  2009-07-01
1.while第一次循环的时候,s指向a的首字母的地址,即s指向g,g的ASCⅡ码值为103,不满足,s++,s指向a的第二个字母的地址,即s指向o,o的ASCⅡ码值为111,不满足,s++,依次类推,应该能看懂吧;
2.你的问题出在函数fun,在c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作为函数参数也要遵循这一规则,不可能通过调用函数来改变实参指针变量的值;就是说执行完fun后,a和b所指的地址互相传了,但并未影响到p和q所指的地址。
相似回答