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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 罗文杰 于 2012-5-30 21:59 编辑
  1. void swap(int[] arr,int x, int y)
  2. {
  3.                 int temp = arr[x];
  4.                 arr[x] = arr[y];
  5.                 arr[y] = temp;        
  6. }
复制代码
  1. void swap1(int x, int y)
  2. {
  3.         int temp = x;
  4.         x = y;
  5.         y = temp;        
  6. }
复制代码
这两个函数都是第一个是对数组内的元素进行互换,第二个是对两个整形变量进行互换。
我的疑惑是,如果第二个函数传入数组元素 比如说 有个int [] arr数组,然后使用swap1(arr[1],arr[10]),为什么两个值不能换,这样代入数组元素跟第一个函数的区别是什么?
我觉得可能是内存地址指向的问题,或者是形参指向的问题,不过想了半天没想明白,脑子成浆糊了- -!求详细指点,最好说下内存指向的问题, 谢谢了~~~

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

10 个回复

倒序浏览
你的意思是
class text

{
       public static void swap1(int x, int y)
      {
            int temp = x;
            x = y;
            y = temp;
      }

      public static void main(String[] args)
      {
            int[] num = {1,2,3};
            swap1(num[0],num[1]);
      }
}

这个很好理解啊。首先,你swap1();这个方法里面只是将num数组中的两个元素传到了这个方法中去
个方法也只是将x和y做了交换,并没有将num数组中的位子做交换。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
swap1你在和数组关联起来也可以交换数组啊,前提是要能修改数组
swap是肯定能交换数组
回复 使用道具 举报
数组是引用数据类型作用与堆.局部变量作用于栈!堆中元素没指向才变垃圾被回收.局部变量用完以后立刻释放.不会储存!

点评

嗯,第二个函数不能起到任何作用,形参无法作用到实参上,除非用指针。  发表于 2012-5-30 21:57
回复 使用道具 举报
LZ!你的swap方法是置换数组元素的值,swap1是置换任意两个整数值。
swap方法用到了数组,数组是存储在堆内存的,栈内存变量arr指向堆内存数组的起始地址。
数组是一个整体,如果要把数组当作参数,必须把整体当作参数传进去。
你把arr[1],arr[10]当作swap1的形参是不对的。你改变的,只是在swap1方法里两个变量的值,而数组里的值并没有改变。

希望能帮到你!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
第一个方法,是将一个数组arrr的角标为X和Y的两个数交换;

第二个方法就是将两个传进的参数进行交换。

两者不同的是,前面X和Y是角标。
回复 使用道具 举报
江南 黑马帝 2012-5-30 20:18:12
7#
第一个你将一个数组arrr的角标为X和Y的两个数交换;数组是带着内存地址过去的 是实参

第二个交换位置只是穿的是形参 并没有改变 x,y的值 局部变量是不能改变全局变量的值
回复 使用道具 举报
第一个是通过角标来实现两个值的比较然后进行交换,数组在堆内存中,是个引用变量,不可变,利用第二种函数,对于数组的指向没变,所以数组压根没变。
这个最好是画出内存分析图就能瞬间了解的。
回复 使用道具 举报
其实这个就像是C语言中的经典指针问题, 第一个函数:swap(int arr[], int x ,int y )    函数中传的是数组元素arr[x], arr[y],数组名其实就代表了首元素的地址,这个x、y就相当偏移量,指向的就是两个实际参数。    第二个函数:swap1  实际上是在对两个形参的值进行交换,不影响到实参的变化,如果要改变实参的值,必须传地址。

点评

嗯,java没有指针,所以形参就不会作用到实参上,第二个函数即使代入整形变量也是没有任何作用的,谢谢!  发表于 2012-5-30 21:55
回复 使用道具 举报
{:soso_e113:}衷心谢谢楼上各位,第二个函数没有任何作用,形参的代入无法作用到实参上面,除非利用指针等操作,而形参改变完,也在内存中释放掉了。了解了 {:soso_e182:}
回复 使用道具 举报
首先回答你的"使用swap1(arr[1],arr[10]),为什么两个值不能换,这样代入数组元素跟第一个函数的区别是什么?"这个问题.
首先你第二个函数的形式参数是两个整型变量.函数的功能是将两个值分别调换.
你传入的arr[1]和arr[10]是数组中的两个值,所以调换的只是数组中的值.但是内存地址没有变.所以你实际的数组是不会变的.
其次,第一个函数的作用是将数组和数组下标作为形式参数.当你传入数组时,其实传入的是内存地址(很类似于c语言的指针),
就是数组首地址指向于堆内存中的数组,可以直接操作堆内存中数组.所以你调换之后,两个值的内存地址也改变了.所以就调换成功.

感觉自己说的罗里吧嗦的,不过希望楼主能仔细细思考一下,想明白!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马