09年4月计算机二级C真题 选择第27道 哪位大虾能帮我分析一下...??万分感谢!

来源:百度知道 编辑:UC知道 时间:2024/06/10 20:33:57
题目如下:有以下程序
#include<stdio.h>
void f(int *p,int *q);
main()
{
int m=1,n=2,*r=&m;
f(r,&n);printf("%d,%d",m,n);
}
void f(int *p,int *q)
{
p=p+1; *q=*q+1;
}
程序运行后输出结果: 答案是1,3
为什么? 形参在什么时候可以改变实参的值?
如果能帮我找到这套题的答案分析更好!
请大虾帮忙..!!!

p=p+1 所以r的地址+1 但是输出m 并没有改变 所以是1
*q=*q+1 n的地址里面存的值+1 所以n变为3
当以指针或者引用形式传参的时候 传的是地址 地址内部的值被改变的话 实参相应改变

要注意

形参无论什么时候都无法改变实参的值!

这里传给f函数的参数是两个地址,在函数体内参与运算的只是这两个地址的副本,比如f(r,&n)你可以把它想象为函数新定义了两个int * p=r; int * q =&n;
于是在函数f的执行过程中,函数执行的所有操作使用的都是p和q,因此所有对p和q的操作都不会影响r和&n的值的(而且&n在这里比较特殊,它是一个常量,只能读取不能被更改,只不过指向的值是一个变量,可以被更改)

因此根据上面的分析,函数f的两条语句:p=p+1; *q=*q+1;第一条是直接对形参的值进行操作,不可能改变实参;而第二条语句是对形参所指向的内存地址操作,而这个内存地址就是外部变量n的地址,因此*q=*q+1实质上就是给n加1,因此函数执行完成后,m的值没有变化,n的值加了1,变成3

所以答案是1,3