首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这道C语言题如何解

2012-02-10 
这道C语言题怎么解?#include stdio.hvoidfunc(int*a,intb){b4*ab+2}voidmain(){inta2,b2func(&a,

这道C语言题怎么解?
#include <stdio.h>  
void   func(int   *a,int   b)  
{  
b=4;  
*a=b+2;  
}  
void   main()  
{  
int   a=2,b=2;  
func(&a,b);  
printf( "%d,%d ",a,b);  

}  
在函数func里,改变了主函数里a的值,为6。应该也改变了b的值,怎么运行时b的值没有变,还是2呢?不明白哦

[解决办法]
a是引用,b是传值
[解决办法]
引用可以改变原值,传值是不改变原传递的值的
[解决办法]
func函数中a指针传递,b是值传递。
把a的地址传给func函数,func函数对指针指向的内容进行修改;
把值传递b是先拷贝一个b,将拷贝的b在func函数里修改了,但原来的b是没有改变。
[解决办法]
当参是按传值调的时候,在函数中你改变的只是形参的值,

要想连实参的值一一起改变,在c语言中只能通过传递指针

如你上面函数的第一个参数
[解决办法]
func函数中a指针传递,b是值传递。
把a的地址传给func函数,func函数对指针a指向的内容进行修改,所以取*a时为6;
把值传递形参b是先拷贝一个2给形参b,形参b在func函数里被修改了,func函数结束后销毁形参b,但并没有赋值给原来main函数传到func里的b值,因此原来的b是没有改变还是2。

[解决办法]
如果b改为引用传递,也就时void func(int *a,int& b){..} b就等于4了
[解决办法]
#include <stdio.h>
//先把func函数的参数形式改了省的混淆
void func(int *d,int c)
{
c=4;
*d=c+2;
}
void main()
{
int a=2,b=2;
func(&a,b);
printf( "%d,%d ",a,b);
}
函数展开结果是
void main()
{
int a=2,b=2;
//以下把func函数展开到这里
int *d=&a;
int c=b; //c=b=2,但是b依然没有变还是2,呵呵!
c=4;
*d=c+2; //这里*d是a吧:4+2=6
//以上把func函数展开
printf( "%d,%d ",a,b);
}
以上能理解了么?
[解决办法]
传递a的时候传递了引用,这个时候相当于a传过去了
传递b相当于传递了b的副本,只是相当于另一个b,而原来的b没传过去

[解决办法]
func函数中a为指针调用,b是传值调用。
指针调用相当于传递的是a元素的地址,在C语言中所有的传送地址的实参函数都可以对数据进行修改,而传值调用相当于传入进去一个只读性数据,函数对其不能进行实质性的更改。

热点排行