不管是工作上或是在家里写程式,我都需要同时开发 Javascript, PHP, C&C++ 这几种程式,虽然都是写了好几年的程式,但还是常常会搞混,今天就将这几个语言的 「Call by reference 」用法记录下来。
C&C++ Call by Reference
C 语言的 call by reference 是有很标准的定义,int a 代表一般的变数,而 int &a 代表变数会以 call by reference 的方式传递,这时 a 与传入值(b)会同步,看下面的范例,在 function test1 中,不管 a 值如何变化,传入的值都不会受影响,而在 function test2 中,则是使用 call by reference 的方式,所以当 a 被改变了, 传入的值 b 也跟著变化 。
- #include "stdio.h"
- #include "stdlib.h"
- void test1(int a) {
- a = 10;
- }
- void test2(int &a) {
- a = 10;
- }
- main() {
- int a = 1;
- int b = 1;
- int c[2] = {1, 0};
- test1(a);
- printf("%i n", a);
- //output: 1
- test2(b);
- printf("%i n", b);
- //output: 10
- }
C&C++ 中的 Array 一定会是一个指标物件,所以强迫变成 call by reference 的方式。
- #include "stdio.h"
- #include "stdlib.h"
- void test3(int array[]) {
- array[1] = 2;
- }
- main() {
- int c[2] = {1, 0};
- test3(c);
- printf("%i %i", c[0], c[1]);
- // output: 1 2
- }
PHP Call by Reference
PHP 要将变数以 Reference 得方式传给 function 时,必须在 function 定义变数名称时,前面加上 「&」 符号 ,下面的两个 function,第一个 test1 不带 「&」 符号,所以没有 Reference 的效果,就算你的变数是 Array 也是一样无效,而第二个 test2 则有 Reference 的效果,当变数值被改变,原传入前的变数也跟著同步。
- <?php
- $a = array("ss");
- $b = array("ss");
- function test1($array) {
- $array[] = "bbb";
- }
- function test2(&$array) {
- $array[] = "bbb";
- }
- test1($a);
- print_r($a);
- // Output: Array (ss)
- test2($b);
- print_r($b);
- //Output: Array(ss, bbb)
Javascript call by reference
Javascript 中,只要是 Array, Object 都会以 call by reference 的方式传递,而一般的 String, Number 等变数值则以 call by value 的方式传递,看下面的范例, test1 的参数 i 是一值的数字,所以没有 call by reference 的效果,而 test2 的参数 array ,他的变数形态就是一个 Array,所以只要 array 被修改,传入的参数值也会跟著变动。
- function test1(i) {
- i = 2;
- }
- function test2(array) {
- array[1] = 2;
- }
- var a = 1;
- var b = [1];
- test1(a);
- console.log(a);
- //output: 1
- test2(b);
- console.log(b);
- //output: 1, 2