c语言程序??帮忙解答

江苏省高等学校计算机等级考试
新版全真模拟试卷系列

二级c语言
全真模拟试卷 2009试卷专用版
中的问题
第十份
填空7

#include<stdio.h>
int*p;
main()
{int a=1,b=2,c=3;
p=&b;
pp(a+c,&b)
printf("(1)%d %d\n",a,b,*p);
}
pp(int a,int* b)
{ int c=4;
*p=*b+c;
a=*p-c;
printf("(2)%d %d\n",a,*b,*p);
}

我的错误答案: (2)2 2 6
(1)1 2 2

填空12

#include<stdio.h>
main()
{ int a=1,b=2,c=3,d;
d=fun(&s,&b,c);
printf("%d,%d,%d,%d",a,b,c,d);
}
fun(int *a,int *b,int c)
{ *a=(*b)++;
return(--c);
}

我的错误答案: 1 2 3 2

第七份
填空11

#include "stdio.h"
void num()
{ extern int x,y;int a=15,b=10;
x=a-b;y=a+b;
}
int x,y;
main()
{ int a=7,b=5;
x=a+b;y=a-b;
num();
printf("%d,%d\n",x,y);
getch();
}

我的错误答案:12,-2
不是说了 viod定义的函数没有返回值么,为什么还是其他答案??

填空12
#include<stdio.h>
void fun(char *a,char *b)
{ a=b;
(*a)++;

}
main()
{ char c1='A',c2='a';
char *p1,*p2;
p1=&c1; p2=&c2;
fun(p1,p2);
printf("%c%c\n",c1,c2);
getch();
}

我的错误答案: ba

第六份
选择23

#include<stdio.h>
main()
{ int x=10, *p=&x;
printf("%d,%d",++x,++*p);
getch();
}

我的错误答案:11,12 好奇怪啊,为什么是彻底相反的??

打击帮帮忙,答案我知道,我都运行过了,但是为什么是那样的答案???解答下吧,感激不尽的~~~

这么多题,会不会太累了啊,你的基本问题在于没有理解好指针,指针是一个指向某个变量的地址,因此对于指针所指向变量的地址里的值的修改,会影响到这个变量的值。
1、 给你解释一下PP函数吧,
pp(int a,int* b)
{ int c=4;
*p=*b+c; //p是全局指针,针向了main函数中的局部变量b的地址,因此只要全局指针p所指向的地址的值改变了,那么变最b的值也就随之改变,并与*p相同,因此这里的结果*p应该为*b+c也就是2+4,结果是*p=6,同时变量b的值也是6,而pp中的局部变量指针b也是指向的main函数中的局部变量b的地址,因此*b也就是指的main函数中局部变量b的值为6
a=*p-c; //a的值为6-4等于2
printf("(2)%d %d\n",a,*b,*p); //所以输出的值是2,6,6
}

第2题的正确形式应该如下

int fun(int*,int*,int);
void main()
{ int a=1,b=2,c=3,d;
d=fun(&a,&b,c); //这里第一个参数应该是&a,没有&s
printf("%d,%d,%d,%d",a,b,c,d);

}
int fun(int *a,int *b,int c)
{ *a=(*b)++; //这里的局部变量a是一个指针,指向的是main函数中的局部变量a的地址,语句*a=(*b)++的结果是先求表达式再把变量加1,结果*a=2;*b=3,因此指针a所指向的地址的值被改变为2,也就是说在main函数中的局部变量a的值应该为2。而*b所指向的地址(main函数中的局部变量b)的值也被修改为3,结果就是main函数中的局部变量b的值被修改为3了。
return(--c); //反回变量C的值,因为c不是一个指针,因此这里的变量c不会改变main函数中变量c的值。结果是main函数中的c值仍然为3,但d值为2。
}

第3题
void num()
{ extern int x,y; //这个函数是没有反回值,但你要注意extern关见字,这个关键字在这里的作用是引入定义的全局变量x和y,也就是说这里的变量x和y是全局变量,而不是num函数中的局部变量。全局变量的值在整个程序中都是可见的,而不局限于某一函数中。因此在这里对全局变量x和y的改变会反应到整个程序中。
int a=15,b=10;
x=a-b;y=a+b; //这一句将全局变量x的值赋值为5,y的值赋值为25。
}
int x,y;
main()
{ int a=7,b=5;
x=a+b;y=a-b; //使全局变量x的值为12 ,y的值为2
num(); //调用num函数,我们看到了,在num函数中程序把全局变量x的值改为了5,y的值改为了25。因为全局变量是在整个程序中都可见的,因此num函数改变了全局变量x和y的值,结果x的值为5,y的值为25
printf("%d,%d\n",x,y); //输出5,25
getch(); //这个函数我不知道是什么意思了。
}
第4题:
void fun(char *a,char *b)
{ a=b; //将指针b的地址赋给a
(*a)++; //这句就是改变了指针b所指向的地址c2中的值,也就是c2的值被修改为b了。c1的值没有影响。

}
main()
{ char c1='A',c2='a';
char *p1,*p2;
p1=&c1; p2=&c2;
fun(p1,p2);
printf("%c%c\n",c1,c2);
getch();
}

第5题
printf("%d,%d",++x,++*p);//解释这句吧,这句小括号里面的语句,"%d,%d",++x,++*p在C语言中逗号是一个运算符,因此这是一个逗号表达式,而对于前缀++的运算规则是,先使变量加1,然后再求表达式,因此在这个表达式中应该先求++x,然后再求++*p,最后再注逗号表达式,结果也就是printf函数输出2个12了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-03-09
第一题:p是全局指针,p=&b;主函数里面调用PP函数时传的是b的地址,所以pp函数里面指针p和指针b是相等的,不管改变哪个另一个都会随着改变 ,并且主函数里面的整形变量b的值也会改变
第二题不知道你s哪里来的
最后一题是printf()函数参数填入次序问题,是从后向前的。

楼主指针方面还有待加强
相似回答