黑马程序员技术交流社区

标题: 数组的小问题 可是我看不懂 [打印本页]

作者: 王红霞    时间: 2012-7-10 03:57
标题: 数组的小问题 可是我看不懂
本帖最后由 王红霞 于 2012-7-10 15:51 编辑

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //为什么会出错?
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

==========================================================

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[0]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[0]=4; //这个结果就正确输出
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

输出结果是:5, 2, 4

作者: 贾存双    时间: 2012-7-10 04:28
因为上面你是初始化给数组分配的空间,就分配了一个空间c[0],所以写c[1]就越界了。
而下面你写c[0]=4就是改变了原来空间里面的值,就是4替换掉了3并保留下来了。
作者: 李志广    时间: 2012-7-10 08:21
因为数组下标越界了, int[] c={3},数组中虽然有一个元素,但是他的角标是从0开始的,也就是0、1、2、3、4、、、、。数组的实际长度应该是:arr.length-1才正确,希望我的回答对你有所帮助!{:soso_e100:}
作者: 万宝东    时间: 2012-7-10 08:49
public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};      //这里将数组定义成长度为1的数组,里面只有一个元素
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //为什么会出错?    //这里给数组修改角标为1(第二个元素)的元素,就会数组角标越界,下面的程序修改的是角标为0的元素,就没有问题。
     }
作者: 封明川    时间: 2012-7-10 08:52
public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};    //你定义的数组里只有一个数,角标是从0开始的
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //为什么会出错?  这里的角标是1 了,角标越界了
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

==========================================================

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[0]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[0]=4; //这个结果就正确输出
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}
作者: 孙新强    时间: 2012-7-10 10:51
这个程序主要涉及两个问题,一、内存分配;二参数传递。通过g(b,c)方法调用,public void g(int b, int[] c) {
       a = 5;
       b = 8; //这里是一个值类型传递,结果b的值不会改变
       c[0]=4; //这里是一个引用传递 ,首先c[]这个数z子这个方法中只是进行了声明定义,并没有在内存中分配空间,它是根据传递进来的数组空进大小而确定的,因为传递 进来的数组只分配了一个空间大小 所以在此只能引用c[0], 另外,数组是引用类型传递,所 以c[0]结果为4
}

作者: 姬仁贵    时间: 2012-7-11 15:49
本帖最后由 姬仁贵 于 2012-7-11 15:50 编辑

public class Demo2
{
    int a;
    int b;
    int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3}; //将3这个元素存入到数组C里面,也就是说c里面就一个元素。
       g(b, c); //调用g函数。
       System.out.println(a + ", " + b + ", " + c[1]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[1]=4; //因为C数组里面就一个元素,因为数组下表是从0开始的,当数组里就一个元素时数组的下标为0;即C[0]=4;所以在这里c[1]=4会出现角标越界的错误。
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}

==========================================================

public class Demo2
{
    int a;
    int b;
        int[] c;
    public void print_1() {
       a = 1;
       b = 2;
       int[] c={3};
       g(b, c);
       System.out.println(a + ", " + b + ", " + c[0]);
    }
    public void g(int b, int[] c) {
       a = 5;
       b = 8;
       c[0]=4; //因为这里数组的角标是正确的,所以会输出正确。在这里c[0]=4将4代替为C[0]里面以前的元素。
    }
    public static void main(String args[]) {
       Demo2 d = new Demo2();
       d.print_1();
    }
}
至于输出结果为什么是:5, 2, 4
因为g(b, c)这条语句里面的b是通过值传递给 public void g(int b, int[] c) 的,
public void g(int b, int[] c) {
       a = 5;
       b = 8; //这里对b的操作不会影响到print_1()里面的b。
       c[0]=4;
    }




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