函数调用的传值和“传址”

2008-02-23 05:34:54来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

函数调用的传值和“传址”
以下文字只想说明一个问题:任何的参数传递都是传值;要想通过函数改变一个变量的值,只有将此变量的地址传入函数。
其实C语言中根本没有传址这一说,任何的函数在传递参数时都是采用的传值调用,即在调用时完成实参对形参的赋值,也就是说在传递参数时永远都是将实参的值传递给形参。那经常用到的指针作形参不是传地址吗?其实不是。我觉得说传址的人是为了让初学者好理解才不得已那么说的(其实在碰到用于输出的参数时,假如我在无法给人讲清楚,或是想节约口舌时也不得不说这是传址调用)。指针作为形参,在函数调用时,传递的是指针的,只但是这个指针是某个变量的地址。其实这个很好理解,大部分C语言初学者也能很容易理解。甚至有人会说,这有意思吗,说传址只但是理解上简单而已,其实谁不知道这个阿。但是当输出参数是指针时,假如简单的理解为传址就可能引起错误。
看下面连个例子
例一:
void swap( int * a, int * b )
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
例二:
void crtHandle( void * handle )
{
handle = malloc( SIZE ); //假设 SIZE 是个已知的整型量
}
在例一中,假如说传址大家很容易理解。函数将整型变量a 和 b 的地址传入,通过两个变量的地址来交换两个变量的值。
而例二中,函数的本意是申请一块内存空间,由参数 handle 将其传出,但是很遗憾这种传址没能达到这个需要。handle 虽然是个指针(存放地址的变量),但此时函数的目的是要在内部修改这个变量,要达到这个目的只有将这个变量的地址值传到函数内部才行,而不是只是看到传址就简单的认为OK了。假如把指针也理解为一个普通变量而不是地址(实际上指针就是存放地址的变量),把参数传递全部理解为传值,这样这个问题变得就简单了。就是:假如您想通过函数改变一个变量的值,则只有将这个变量的地址传入。像例二中,该函数想改变变量 handle 的值,则在传递参数时应将变量 handle 的地址传入,也就是下面这样:
void crtHandle( void * *handle)
{
*handle = malloc( SIZE );
}
罗嗦了半天,总之一句话:任何的参数传递都是传值;要想通过函数改变一个变量的值,只有将此变量的地址传入函数。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1576874




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C++语言常见问题解答(4)

下一篇: VC杂项

热门词条
热门标签