黑马程序员技术交流社区

标题: 为啥不能通过函数间传地址来改变数组里的内容?(完成) [打印本页]

作者: 王琪    时间: 2014-3-2 22:10
标题: 为啥不能通过函数间传地址来改变数组里的内容?(完成)
本帖最后由 王琪 于 2014-3-3 01:06 编辑

  1. package dom;
  2. import java.util.*;
  3. import java.util.ArrayList;
  4. import java.util.ListIterator;
  5. public class Text {  
  6. static void  fun(char[] a){
  7.               
  8.               char []c={ '1','2' ,'3','4' ,'5' };
  9.              a=c;
  10.               
  11.       }
  12. public static void main(String[]args){               
  13.                 char []c={ 'A','B' ,'C','D' ,'E' };
  14.                 fun(c);
  15.                 for(char z:c){
  16.                 System.out.print(z);
  17.                 }
  18.         }
  19.      //最后输出'A','B' ,'C','D' ,'E' 但我想让他变成12345
  20. }
复制代码

作者: 洋葱骑士    时间: 2014-3-2 22:24
main 中C指向一块内存ABCD
然后fun(C)这一步操作,使得fun中的a 指向了这一块区域。
接着fun()中新建的变量 c指向新建的内存1234
然后通过赋值使得fun()中的a指向新的内存1234
fun函数执行完毕,fun()中的a,c内存1234被释放

以上过程中,main中的C始终是指向内存ABCD

然后for(char)输出main 中c指向区域的内容。
所以肯定是'ABCD'
作者: 位俊鹏    时间: 2014-3-2 23:10
  1. public class Demo_1 {
  2.         static void fun(char[] a) {

  3.                 char[] c = { '1', '2', '3', '4', '5' };
  4.                 a = c;
  5.                 for (char z : c) {
  6.                         System.out.print(z);
  7.                 }
  8.         }
  9.         public static void main(String[] args) {
  10.                 char[] c = { 'A', 'B', 'C', 'D', 'E' };
  11.                 fun(c);
  12.                
  13.         }
  14. }
复制代码

//这样就可以输出12345了.
//因为你那个函数返回时void,所以就可以不用返回给调用者了,在本方法了就可以做输出处理.
//其实你这原来已经是改变数组了,但你没有返回,也没有接受,所以你打印时就会出现主函数中的那个数组.
作者: 王琪    时间: 2014-3-2 23:19
原理我好像明白了,但是我就想在主方法里输出,fun方法就管将新对像通过地址传递改变源对象怎么办?
  1. 发现
  2.       1.C语言                                                                                             2java
  3. #include <stdio.h>                                                                         class java{
  4. void fun(char p[] ){//char *p                                                         void fun(  char [] p ){
  5.     char code[]={'4','5','6','7'};                                                            char []code={'4','5','6','7'};
  6.     p=code//此时p所指的对象本身发生了变化                                     p=code;   ///应该只是对象句柄转移
  7. }                //如果参数改为char p[4]是传值像java的克隆                   }                   //不会干扰传来的a数组
  8. void main(){                                                                                   public static void main(String[]args){
  9.     char a[]={'1','2','3','4'};                                                                  char [] a={'1','2','3','4'};
  10.      fun(  a );     printf("%s",a)   // 输出4567                                   fun( a );  System.out.println(new String(a));  //输出1234
  11. }                                                                                                    }  }//System.out.println(a);将输出乱码地址
复制代码


作者: 乔青山    时间: 2014-3-2 23:21
因为Java只有值传递,没有引用传递。你传递了复本然后改变复本的引用对于原来的数组是没有任何影响的,你必须要把复本所只想的地址中的内容改变才会对原数组造成改变。所以你的方法里应该有个遍历然后对每个元素赋值。
作者: twtzhongxin    时间: 2014-3-2 23:24
java跟C不同,java是值传递的
  1. public class EasyTest4 {
  2.        
  3.         static char[] fun(char[] a){
  4.                 char []c={ '1','2' ,'3','4' ,'5' };
  5.                 a=c;
  6.                 return a;//返回数组a
  7.                 }
  8.         public static void main(String[]args){
  9.                 char []c={ 'A','B' ,'C','D' ,'E' };
  10.                 c=fun(c);
  11.                 for(char z:c){
  12.                         System.out.print(z);
  13.                         }
  14.                 }       
  15. }
复制代码

作者: 王琪    时间: 2014-3-3 00:38
乔青山 发表于 2014-3-2 23:21
因为Java只有值传递,没有引用传递。你传递了复本然后改变复本的引用对于原来的数组是没有任何影响的,你必 ...

哦 我明白了,终于明白了。。谢谢你:)
作者: 王琪    时间: 2014-3-3 00:40
twtzhongxin 发表于 2014-3-2 23:24
java跟C不同,java是值传递的

嗯,什么是值传递,引用传递啊?:)谢谢你

作者: 王琪    时间: 2014-3-3 01:05
我问的问题有点低级了,嘻嘻




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2