黑马程序员技术交流社区
标题:
看到数组时的疑问
[打印本页]
作者:
郭哲彦
时间:
2012-2-13 20:01
标题:
看到数组时的疑问
我在看毕向东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]+"]");
}
}
}
作者:
郭哲彦
时间:
2012-2-13 20:29
是不是栈内存和堆内存的关系?
数组占用堆内存,所以相当于c里面的全局变量?
作者:
侯丽星
时间:
2012-2-13 20:37
本帖最后由 侯丽星 于 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语言中的指针(传地址)的。
作者:
陈丹阳
时间:
2012-2-13 20:45
数组是引用类型变量,作为参数传递时传的是地址(指向原数组),所以某个函数对传进去的数组引用进行的操作,该地址对应的数组也相应改变。
这点跟C是一样的。这是我的理解。
作者:
郭哲彦
时间:
2012-2-13 20:47
又看了第三天最后一个视频,貌似懂了~
谢谢各位高手
作者:
李杨
时间:
2012-2-13 21:10
在Java中进行方法的参数传递时,无论传递的是原生数据类型还是引用类型,参数传递方式统一是传值(pass by value)。Java中没有传引用(pass by reference)的概念。
数组对象创建后是在堆中分配内存空间的,当你改变堆中数据的时候就会改变这个数组对象所以回倒序。
在C语言中的数组,你要知道C语言中的数组就是指针,是地址。当你给C语言中的函数传递数组的时候是传递的数组首地址,地址是明确好了的,所以你的数组改变后,就相当于对地址做了改变,所以最终会反映到你的数组数据上。
希望你能懂。加油!
作者:
蒙武辉
时间:
2012-2-13 21:43
reverseArray(arr);
arr是一个地址,也可以说是引用。作为参数,也是我们通常说的指针传递。它不像一般的值传递一样,可以拷贝一份值专递给函数去处理,从而不会影响主函数的数组。
作者:
黄锦成
时间:
2012-2-13 22:17
数组引用类型,在主函数里将数组当做参数传递给非主函数里。它们俩操作的都是同一个数组,所以不用返回。初学者要分清楚“值传递”和“引用传递”的区别。给个形象的例子:数组就相当于一台电脑,你和我相当于两个函数,我们共用一台电脑。你在电脑上装了新软件,当我再去用电脑时,会发现电脑里多了一个新软件。
作者:
靖美专
时间:
2012-2-14 16:42
数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。
注意:如果你熟悉C/C++,请注意, Java数组的工作原理与它们不同。
1、数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。
2、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。
作者:
钟保罗
时间:
2012-2-14 20:18
reverseArray(arr)是在调用reverseArray(int[] arr)方法,在里面传入arr这个数组,reverseArray方法里面for循环定义了两个变量,start变量是传进来数组第一个角标的位置,end变量是数组最后一个角标的位置,当没循环一次,第一个角标就会增加一个数到第二角标去,最后一个角标减一个数到倒数第二角标去。。。以此律推,start比end小的时候就继续循环,当end比start小的时候就停止循环。在循环中调用了,swap方法,swap方法里面传进那个数组,第一个角标和最后一个角标。当循环调用一个这个方法的时候,根据传进去那两个角标里面的数据调换位置,这样当循环结束的时候,角标刚好在数组的中间,这样就把整个数组位置就都换了。。。。。。
作者:
刘丁
时间:
2012-2-14 20:27
引用传递。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2