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

 
函数调用的传值和“传址”
        以下文字只想说明一个问题: 所有的参数传递都是传值;要想通过函数改变一个变量的值,只有将此变量的地址传入函数。
 
        其实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 );
}
 
        罗嗦了半天,总之一句话: 所有的参数传递都是传值;要想通过函数改变一个变量的值,只有将此变量的地址传入函数。
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值