在java中数组的调用默认是是传址调用:主体方法中传递一个数组给某个方法,在该方法内修改了数组的某个值;回到主方法中会发现数组已经发生了改变;
测试代码:
public class ArrayTest { public static void main(String[] args){ Map[] maparray=new Map[3]; for (int i = 0; i < maparray.length; i++) { Map<String,String> map=new HashMap<String,String>(); map.put("a", i+"_ajkcz"); map.put("c", "werq_"+i); maparray[i]=map; } System.out.println("++++++++++++++++++++++++"); for (int i = 0; i < maparray.length; i++) { Map<String,String> map=maparray[i]; Iterator it=map.keySet().iterator(); while(it.hasNext()){ String key=(String) it.next(); System.out.println(key+"\t"+map.get(key) ); } } System.out.println("++++++++++++++++++++++++"); new ArrayCharge().printAndChangeArray(maparray); System.out.println("++++++++++++++++++++++++"); for (int i = 0; i < maparray.length; i++) { Map<String,String> map=maparray[i]; Iterator it=map.keySet().iterator(); while(it.hasNext()){ String key=(String) it.next(); System.out.println(key+"\t"+map.get(key) ); } } } } class ArrayCharge { public void printAndChangeArray(Map[] maparray){ for (int i = 0; i < maparray.length; i++) { Map<String,String> map=maparray[i]; map.put("a",i+"________"); } for (int i = 0; i < maparray.length; i++) { Map<String,String> map=maparray[i]; Iterator it=map.keySet().iterator(); while(it.hasNext()){ String key=(String) it.next(); System.out.println(key+"\t"+map.get(key) ); } } } } 控制台输出结果: ++++++++++++++++++++++++ c werq_0 a 0_ajkcz c werq_1 a 1_ajkcz c werq_2 a 2_ajkcz ++++++++++++++++++++++++ c werq_0 a 0________ c werq_1 a 1________ c werq_2 a 2________ ++++++++++++++++++++++++ c werq_0 a 0________ c werq_1 a 1________ c werq_2 a 2________
而在php中,数组的调用默认是传值调用,在字方法中修改了数组,在父方法中无法察觉
测试代码:
<?php $arraytest=array(); for($i=0;$i<3;$i++){ $child=array(); $child['keystr']='key'.$i; $child['valuestr']='value'.$i; $arraytest[]=$child; } print_r($arraytest); print_r("+++++++++++++++++++++++++"); for($i=0;$i<count($arraytest);$i++){ $child=$arraytest[$i]; $child['valuestr']="_________".$i; } print_r($arraytest); print_r("+++++++++++++++++++++++++"); ?> 控制台输出: Array ( [0] => Array ( [keystr] => key0 [valuestr] => value0 ) [1] => Array ( [keystr] => key1 [valuestr] => value1 ) [2] => Array ( [keystr] => key2 [valuestr] => value2 ) ) +++++++++++++++++++++++++ Array ( [0] => Array ( [keystr] => key0 [valuestr] => value0 ) [1] => Array ( [keystr] => key1 [valuestr] => value1 ) [2] => Array ( [keystr] => key2 [valuestr] => value2 ) ) +++++++++++++++++++++++++
如果希望在php中也能类似java中传数组参数给字方法,字方法处理完成后父方法中数组也跟随改变则需要在传递参数时不传递值而是传递值的指针,例如p的值是100,即$p=100;在传递p给字方法时需要传递的参数则为“&$p”
测试代码:
<?php $arraytest=array(); for($i=0;$i<3;$i++){ $child=array(); $child['keystr']='key'.$i; $child['valuestr']='value'.$i; $arraytest[]=$child; } print_r($arraytest); print_r("+++++++++++++++++++++++++"); for($i=0;$i<count($arraytest);$i++){ $child=&$arraytest[$i]; //注意这里加了一个指针符号,代表是传址调用 $child['valuestr']="_________".$i; } print_r($arraytest); print_r("+++++++++++++++++++++++++"); ?> 控制台输出: Array ( [0] => Array ( [keystr] => key0 [valuestr] => value0 ) [1] => Array ( [keystr] => key1 [valuestr] => value1 ) [2] => Array ( [keystr] => key2 [valuestr] => value2 ) ) +++++++++++++++++++++++++ Array ( [0] => Array ( [keystr] => key0 [valuestr] => _________0 ) [1] => Array ( [keystr] => key1 [valuestr] => _________1 ) [2] => Array ( [keystr] => key2 [valuestr] => _________2 ) ) +++++++++++++++++++++++++
相关推荐
1. 传值与传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变:用传值传入的参数是...
传址调用 传址调用 传址调用 传址调用传址调用 传址调用 传址调用 传址调用
传值调用 传值调用 传值调用传值调用 传值调用 传值调用
C++ comparing call_by_value(传值调用) and call_by_reference(引用调用)
js代码-函数调用的传值和传址
传值调用与引用调用.cs
in.ref.out C#传值调用与引用调用
VB 6.0 数组参数调用实例: Dim A1(), B1(), C1() '声明数组 Private Sub Form_Load() Dim i As Integer '给数组赋初值 Show A1 = Array(2, 4, 6, 8, 10) '用Array函数赋值 B1 = Array(1, 3, 5, 7, 9, ...
易语言编写的dll参数的传址调用 1、dll内参数属性:参考勾选,调用时需要勾选传址,否则程序崩溃;且此时参数是传指针的调用。 2、dll内参数属性:参考不勾选,调用时不管勾选不勾选,都可以运行;此时参数是通过...
传值调用,传址调用,引用调用。让你深刻理解函数调用的信息传递
向DLL传递数组参数的实现方法。@易语言代码编写例子。
传值调用
在main函数传值调用
C语言函数调用三种方式 传值调用,引用调用和传地址调
摘要:VB源码,其它类别,数组 VB调用数组的小例子,在程序内部调用数组中的数据。
C语言函数调用三种方式传值调用,引用调用和传地址调[归类].pdf
c#调用c++DLL,DLL里是二维数组 ,c#里如何调用二维数组
为什么会出现指针和数组指针对数组元素调用的方式不同呢? 答:*p是一个指针变量,p指向的其实是a[0]或a[0][0]; 而(*p)[2]是一个数组指针,p指向的其实是a[0],a[1]或a[0][0],a[0][1]这样的形式; 也就是说*p中的p...
对于基本数据类型的变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用的效率相差不大。但是,对于类类型来说,传值调用和引用调用之间的区别很大,类对象的尺寸越大,这种差别越大。 传值调用与后面...
包含内容: 1.Flash8.0制作的老虎机计数器源文件,脚本版本为ActionScript2.0,功能为滚动停止后显示外传参数的数值 2.Html对Flash文件的传值调用...3.Asp.net对Flash文件的传值调用 4.Asp.net连接Access数据库读取数据