C语言中的传值调用与参数

服务器君一共花费了17.019 ms进行了6次数据库查询,努力地为您提供了提供了这个页面。

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

最主要的区别在于,在 C 语言中,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。

传值调用的利大于弊。在被调用函数中,参数可以看作是便于初始化的局部变量,因此额外使用的变量更少。这样程序可以更紧凑简洁。侧如,下面的这个 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 的原始参数值。

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

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

Creative Commons License

本文仅供自己学习与收藏之用,请勿转载,请勿用作其它用途(如商业目的等)。 原文链接:http://www.nowamagic.net/librarys/posts/c/265