
C语言问题。。谁来帮忙解答下啊。
#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;
同理。
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指向的值也就变了。
可以看出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,那么没执行一次,实参指针指向的值就改变了。
另外给你个建议,有了题目为什么不自己装环境验证呢,很简单的事情啊。要只是为了过二级就没必要太过关注了。
2.你的问题出在函数fun,在c语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作为函数参数也要遵循这一规则,不可能通过调用函数来改变实参指针变量的值;就是说执行完fun后,a和b所指的地址互相传了,但并未影响到p和q所指的地址。