1. 传值调用机制 ( call- by-value machanism )
(1). 在形参位置插入的是实参的值。如果实参是变量,则插入的只是变量的值,而非变量本身。
(2). 传值调用形参是局部变量。调用函数时,该函数的形参被初始化为实参的值。
2. 传引用调用机制
(1). 替换形参的是实参的内存位置。由于程序变量是作为内存位置来实现的,所以这些内存位置就是变量。也就是说在形参位置插入的是变量本身,而不是变量的值。
(2). 传引用调用形参是被实参的内存位置替换,故若函数体内对该内存位置有所修改,该变量也会改变。
3. 数组形参和数组实参
函数可将整个数组作为参数。作为形参的整个数组既不是一个传值调用参数,也不是一个传引用调用参数。它是一种新的形参类型,称为数组形参 ( array parameter ) 。数组形参虽然不是一个真正的传引用参数,但它的表现形式与传引用调用参数极为相似。
数组实参是用于替换数组形参的实际参数值。函数主体内对形参发生改变,数组实参也会相应地改变。这与传引用调用一样。那么区别是什么呢?首先我们必须了解数组的组成:
数组是作为一个连续的内存块来存储的。计算机只会记住数组索引为 0 的内存地址,也就是数组的首地址。要访问其他索引值的数组成员,计算机是根据数组首地址来计算其他成员的地址的。例如,声明一个数组 int array [10]; 计算机只会记住 array [0] 的地址, 再根据 array [0] 的地址来计算得到 array [7]的内存位置。因此,可以说数组是由3部分组成的:
-
第一个索引变量的内存位置(数组首地址)
-
数组基类型(决定了每个索引变量的内存大小)
- 数组长度(索引变量的数目)
-
数组作为实参传给函数时,实际用于替换的是数组的首地址(索引为 0 的数组成员的内存位置),并不是整个数组变量(包含所有数组成员)的内存位置。由于数组本身不能告诉函数自己的长度,故通常需要另一个 int 类型的参数来给出数组的长度。
总结:传引用调用机制,传递给形参的是整个实参变量的内存位置,而整个数组作为函数参数时,替换数组形参的只是数组实参的首地址。这就是区别。共同点是若函数体内对参数进行了更改,实参也会相应的改变。
再罗嗦一下,函数体内对任意数组索引成员的更改都是有效的,因为传给函数的是数组首地址,计算机根据首地址找到的也是其他索引成员的内存位置,也就是该索引成员本身。