分析以下程序的运行结果() #include <stdio.h> func(int a,int b) {int temp=a;a=b......

#include <stdio.h>
func(int a,int b)
{
int temp=a;
a=b;b=temp;
}
main()
{
int x,y;
x=10;y=20;
func(x,y);
printf("%d,%d\n",x,y);
}

最后结果是10,20
分析是:这里是传值调用,不会改变实参的值,所以输出为10,20.注意:传值调用时,只将实参的副本传给形参,在函数中只对副本进行修改,不会影响实参的值。

本人对c语言还是很生疏,希望帮忙指点一下哪里传值了,哪个是实参,哪个是形参,副本是什么,请详细说明。谢啦~~~

传值的地方是
x=10;y=20;
func(x,y);
把x和y传给函数func。
所以实参是x和y,形参是a和b。
至于副本,是由编译器做的,比如对于你给的例子,编译器会创建副本
_x=10;_y=20;
在func函数交换的值是_x和_y的值,不会改变x和y自身的值,
传地址的时候比如改成func(int* a,int* b)
{
int temp=*a;
*a=*b;*b=temp;
}
func(&x,&y);
编译器也会创建副本,只不过副本的值是&_x和&_y
与&x和&y的值是一样的(同一块地址中的值),这样交换的话就会改变x和y本身的值,
所以传值和传地址的实质是一样的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-02
func(int a,int b)
{
int temp=a;
a=b;b=temp;
}
传的是形参。所以不会改变a,b的值。
#include <stdio.h>
func(int a,int b)//形参
{
int temp=a;
a=b;b=temp;
}
funcA(int & a,int & b)//传入引用,会改变值
{
int temp=a;
a=b;b=temp;
}
funcB(int * a,int * b)//传入地址,即指针,会改变值
{
int temp = * a;
*a=*b;*b=temp;
}
main()
{
int x,y;
x=10;y=20;
func(x,y);
printf("%d,%d\n",x,y);
funcA(x,y);//值变了
printf("%d,%d\n",x,y);
funcB(&x,&y);//值变了
printf("%d,%d\n",x,y);
}
第2个回答  2012-02-02
func(int a,int b) a,b是形参
func(x,y); x,y实参
值传递是x,y作为参数给函数2个数值,并不是给了函数地址
值传递进入函数对于变量的作用域不同,所以函数相当于重新开辟的地址保存值,所以不会影响原来的值
第3个回答  2012-02-06
因为你调用FUN(X,Y)时,只是把X,Y的值赋值给A和B。
就相当于:int x=10,y=20,a=x,b=y;你改变变量A,B的值,XY当然
不会受到影响。
第4个回答  2012-02-02
haha,其实道理很简单,你知道函数的参数是属于形参吗,比如全局变量就是实参,数值传进去后编译器会做一个副本,例如参数a_1 = a; b_1 = b; 而函数内部用的是a_1和b_1,所以没有改变a和b的,如果需要做交换ab的值,就传入地址,比如穿ab的引用

#include<stdio.h> void fun(int*a,int*b) {int*c; c=a;a=b;b=c;}...
所以p和q仍然分别指向x和y。再回到fun函数中,可以看出,a和b的值(x和y的地址)是交换了,也即是说a原本指向x,现在指向了y,对应的b改为指向x。但这只能说a和b间有变化。会影响到x和y吗?也不会。所以fun函数其实对x,y,p,q没有产生任何的影响,当然结果就应该是3,5,3,5了。希望你...

#include <stdio.h> int func(int x,int *p); void main( ) { int...
func作用是将传入的第二个参数改为x+2+1=x+3,并返回2x+2+2=2x+4,所以 int a=1,b=2,c;c=func(a,&b); \/\/这句执行后b=a+3=4 c=2*a+4=6 b=func(c,&b);\/\/同上,b=2*6+4=16 a=func(b,&c);\/\/ c=16+3=19 a=2*16+4=36 即abc分别为36 16 19 ...

以下程序的输出结果是___。 #include 〈stdio.h〉 main...
A.8,17

#include <stdio.h> int exchange( int a, int b ) { int temp; temp...
函数的参数改一改就可以了。include <stdio.h> void exchange( int *a, int *b ){ int temp;temp = *a;a = *b;b = temp;return;} int main(){ int x, y, z;printf( "please input three integers:\\n" );scanf( "%d%d%d", &x, &y, &z );if( x > y )exchange( &x,...

以下程序运行的结果是 。 #include<stdio.h> #include
include<stdio.h>#include<string.h>\/\/=== 函数部分=== fun(char *w, int n){ char t,*s1,*s2; \/\/定义字符t,字符指针s1,s2 s1=w; s2=w+n-1; \/\/将上面的指针p赋予指针s1,s2是在s1右移7-1=6 实际*s2='7' while(s1<s2) \/\/当s1指向的地址,少于s2指向的地址时【...

以下程序的输出结果是___. #include <stdio.h> main() {int a=2,i...
1.这里static c=3,局部修饰c,所以c的值是不变的。(注:当static在函数中修饰局部变量时,该变量为静态变量,不再存放在堆栈中,函数结束也不会销毁,每次进入该函数的时候变量值还是上次函数退出时候的值。静态变量只能初始化一次。)2.a的值是不变的。3.b的值每次加1.4.i=0,1,2,共三个...

#include<stdio.h> void func(int b) { int a; a=b;b=10;} void main...
局部变量作用域的问题!当调用func(b);时,main里面的b会把值复制到func里面的b,两个b是不同的!在func中有又定义了一个a,当func运行完后,func的a和b生存期和作用域就结束了!main里的a和b还是原样,func的运行没有影响到main里的a和b!

#include<stdio.h> func(int a,int b){static int m=0,i=2;i+=m+1...
include<stdio.h> func(int a,int b){ static int m=0,i=2; i+=m+1; m=i+a+b; return(m);}main(){ int k=4,m=1,p; p=func(k,m); printf("%d,",p); p=func(k,m); printf("%d\\n",p)}打印的是两次调用func的返回值。主函数中k,m值不...

...#include<stdio.h> 编译预处理指令 int main() 定义主函数_百度知 ...
解析:sort函数 返回值空 struct Student结构体类型 应该已经在这段程序前定义好了 函数参数是一个结构体类型数组 局部变量 temp 用来交换 j选择两种方案 i k循环计数 clrscr()清屏 输入提示 读取方案种类 第一种方案 按照stu属性num冒泡升序排序 第二种方案 按照stu属性aver冒泡升序排序 冒泡排序是...

以下程序的输出结果是___。 #include <stdio.h> main() {int k=4,m...
第一次func(a,b)函数时,传递过来的两个值是4,1 即在func(a,b)函数中a=4,b=1 static int m=0,i=2,定义了两个静态变量,即一直战用内存,函数调用结束不释放,结果依然是上一次改变后的结果。执行 i+=m+1 →即 i=2+0+1=3;执行 m=i+a+b; → m=3+4+1=8;执行...

相似回答