A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

郭哲彦

注册黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 郭哲彦 注册黑马   /  2012-2-13 20:01  /  2319 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我在看毕向东day4的视频。为什么对数组在非主函数里的操作后,不用返回?
难道数组是全局变量?
//为什么调用上面reverseArray(arr)函数后,把主函数里面的数组arr改变了?貌似跟c不一样

下面是代码





/*
对给定的数组进行反转。
{3,1,5,6,2} --->
{2,6,5,1,3}
*/

class  ArrayTest3
{
        public static void main(String[] args)
        {
                int[] arr = {3,1,5,6,2};
                printArray(arr);

                //反转后;
                reverseArray(arr);
                               //为什么调用上面这个函数后,把主函数里面的数组arr改变了?貌似跟c不一样
                printArray(arr);
        }
        public static void reverseArray(int[] arr)
        {
                for(int start=0,end=arr.length-1; start<end ; start++,end--)
                {
                        /*
                        int temp = arr[start];
                        arr[start] = arr[end];
                        arr[end] = temp;
                        */
                        swap(arr,start,end);
                }
        }
        public static void swap(int[] arr,int a,int b)
        {
                int temp = arr[a];
                arr[a] = arr[b];
                arr[b] = temp;
        }
        public static void printArray(int[] arr)
        {
                System.out.print("[");
                for(int x=0; x<arr.length; x++)
                {
                        if(x!=arr.length-1)
                                System.out.print(arr[x]+", ");
                        else
                                System.out.println(arr[x]+"]");

                }               
        }
}

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

10 个回复

倒序浏览
是不是栈内存和堆内存的关系?
数组占用堆内存,所以相当于c里面的全局变量?
回复 使用道具 举报
本帖最后由 侯丽星 于 2012-2-13 20:45 编辑

首先:main中的int[] arr = {3,1,5,6,2};这句话的意思是,定义了一个arr变量,它指向了一个数组,即:{3,1,5,6,2},也可以说arr是对该数组的一个引用。
main通过reverseArray(arr);将arr的引用传递给了public static void reverseArray(int[] arr)形参中的arr,也即reverseArray形参中的arr与main中的arr指向的是同一个地址,因此在reverseArray中操作arr,就相当于对main中的arr进行操作。

其实这种用法还是类似于c语言中的指针(传地址)的。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
数组是引用类型变量,作为参数传递时传的是地址(指向原数组),所以某个函数对传进去的数组引用进行的操作,该地址对应的数组也相应改变。

这点跟C是一样的。这是我的理解。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
又看了第三天最后一个视频,貌似懂了~
谢谢各位高手
回复 使用道具 举报
在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方式统一是传值(pass by value)。Java中没有传引用(pass by reference)的概念。

数组对象创建后是在堆中分配内存空间的,当你改变堆中数据的时候就会改变这个数组对象所以回倒序。

在C语言中的数组,你要知道C语言中的数组就是指针,是地址。当你给C语言中的函数传递数组的时候是传递的数组首地址,地址是明确好了的,所以你的数组改变后,就相当于对地址做了改变,所以最终会反映到你的数组数据上。

希望你能懂。加油!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
蒙武辉 黑马帝 2012-2-13 21:43:34
7#
reverseArray(arr);
arr是一个地址,也可以说是引用。作为参数,也是我们通常说的指针传递。它不像一般的值传递一样,可以拷贝一份值专递给函数去处理,从而不会影响主函数的数组。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
数组引用类型,在主函数里将数组当做参数传递给非主函数里。它们俩操作的都是同一个数组,所以不用返回。初学者要分清楚“值传递”和“引用传递”的区别。给个形象的例子:数组就相当于一台电脑,你和我相当于两个函数,我们共用一台电脑。你在电脑上装了新软件,当我再去用电脑时,会发现电脑里多了一个新软件。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
靖美专 黑马帝 2012-2-14 16:42:12
9#
数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。

注意:如果你熟悉C/C++,请注意, Java数组的工作原理与它们不同。

1、数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。

2、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
回复 使用道具 举报
reverseArray(arr)是在调用reverseArray(int[] arr)方法,在里面传入arr这个数组,reverseArray方法里面for循环定义了两个变量,start变量是传进来数组第一个角标的位置,end变量是数组最后一个角标的位置,当没循环一次,第一个角标就会增加一个数到第二角标去,最后一个角标减一个数到倒数第二角标去。。。以此律推,start比end小的时候就继续循环,当end比start小的时候就停止循环。在循环中调用了,swap方法,swap方法里面传进那个数组,第一个角标和最后一个角标。当循环调用一个这个方法的时候,根据传进去那两个角标里面的数据调换位置,这样当循环结束的时候,角标刚好在数组的中间,这样就把整个数组位置就都换了。。。。。。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
刘丁 黑马帝 2012-2-14 20:27:22
11#
引用传递。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马