The C Programming Language(第 2 版) 笔记 / 1 介绍 / 1.8 传值调用

目录、参考文献


1.8 传值调用

习惯其它语言(特别是 Fortran 语言)的程序员可能会对 C 语言的函数参数传递方式感到陌生
在 C 语言中,所有函数参数都是 “ 通过值 ” 传递的
也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中
这与其它某些语言是不同的,比如 Fortran 等语言是 “ 通过引用调用 ”
Pascal 则采用 var 参数的方式
在这些语言中,被调用的函数必须访问原始参数,而不是访问参数的本地副本
最主要的区别在于,在 C 语言中,被调用函数不能直接修改主调函数中变量的值,而是只能修改其私有的临时副本的值

理解
编译器将源码编译成汇编时采用的策略不同
1)通过值传参
参数值在内存中,调用函数时,会先将值复制一份到寄存器中
函数执行过程中对参数的赋值会修改寄存器中的值,不会修改内存中的值
2)通过引用传参
参数值在内存中,调用函数时,将参数值的内存地址放到寄存器中
函数执行过程中对参数赋值时,通过寄存器寻址找到参数的内存地址,并改变参数在内存中的值

传值调用的利大于弊
在被调用的函数中,参数可以被看作是便于初始化的局部变量
因此额外使用的变量更少,这样程序可以更紧凑简洁
侧如,下面的这个 power 函数利用了这一 性质:

/* power: raise base to n-th power; n >= 0; version 2 */ 
int power(int base, int n) 
{ 
    int p; 
    for (p = 1; n > 0; --n) 
        p = p * base; 
    return p; 
}

其中,参数 n 被用作临时变量,并通过随后执行的 for 循环语句递减,直到其值为 0,这样就不需要额外引入变量 i
power 函数内部对 n 的任何操作不会影响到调用函数中 n 的原始参数值

必要时,也可以让函数能够修改主调函数中的变量
这种情况下,调用者需要向被调用函数提供待设置值的变量的地址(从技术角度看,地址就是指向变量的指针)
而被调用函数则需要将对应的参数声明为指针类型,并通过它间接访问变量
我们将在第 5 章中讨论指针

如果是数组参数,情况就有所不同了
当把数组名用作参数时,传递给函数的值是数组起始元素的位置或地址 —— 它并不复制数组元素本身
在被调用函数中,可以通过数组下标访问或修改数组元索的值


目录、参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值