黑马程序员技术交流社区
标题:
[已解决]弱弱的问下这两个函数的区别,谢谢!!
[打印本页]
作者:
罗文杰
时间:
2012-5-30 18:55
标题:
[已解决]弱弱的问下这两个函数的区别,谢谢!!
本帖最后由 罗文杰 于 2012-5-30 21:59 编辑
void swap(int[] arr,int x, int y)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
复制代码
void swap1(int x, int y)
{
int temp = x;
x = y;
y = temp;
}
复制代码
这两个函数都是第一个是对数组内的元素进行互换,第二个是对两个整形变量进行互换。
我的疑惑是,如果第二个函数传入数组元素 比如说 有个int [] arr数组,然后使用swap1(arr[1],arr[10]),为什么两个值不能换,这样代入数组元素跟第一个函数的区别是什么?
我觉得可能是内存地址指向的问题,或者是形参指向的问题,不过想了半天没想明白,脑子成浆糊了- -!求详细指点,最好说下内存指向的问题, 谢谢了~~~
作者:
杨天皓
时间:
2012-5-30 19:12
你的意思是
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数组中的位子做交换。
作者:
张晨
时间:
2012-5-30 19:17
swap1你在和数组关联起来也可以交换数组啊,前提是要能修改数组
swap是肯定能交换数组
作者:
丁桂松
时间:
2012-5-30 19:20
数组是引用数据类型作用与堆.局部变量作用于栈!堆中元素没指向才变垃圾被回收.局部变量用完以后立刻释放.不会储存!
作者:
徐炯
时间:
2012-5-30 19:44
LZ!你的swap方法是置换数组元素的值,swap1是置换任意两个整数值。
swap方法用到了数组,数组是存储在堆内存的,栈内存变量arr指向堆内存数组的起始地址。
数组是一个整体,如果要把数组当作参数,必须把整体当作参数传进去。
你把arr[1],arr[10]当作swap1的形参是不对的。你改变的,只是在swap1方法里两个变量的值,而数组里的值并没有改变。
希望能帮到你!
作者:
钟成军
时间:
2012-5-30 19:47
第一个方法,是将一个数组arrr的角标为X和Y的两个数交换;
第二个方法就是将两个传进的参数进行交换。
两者不同的是,前面X和Y是角标。
作者:
江南
时间:
2012-5-30 20:18
第一个你将一个数组arrr的角标为X和Y的两个数交换;数组是带着内存地址过去的 是实参
第二个交换位置只是穿的是形参 并没有改变 x,y的值 局部变量是不能改变全局变量的值
作者:
余银桂
时间:
2012-5-30 21:09
第一个是通过角标来实现两个值的比较然后进行交换,数组在堆内存中,是个引用变量,不可变,利用第二种函数,对于数组的指向没变,所以数组压根没变。
这个最好是画出内存分析图就能瞬间了解的。
作者:
杨卫腾
时间:
2012-5-30 21:50
其实这个就像是C语言中的经典指针问题, 第一个函数:swap(int arr[], int x ,int y ) 函数中传的是数组元素arr[x], arr[y],数组名其实就代表了首元素的地址,这个x、y就相当偏移量,指向的就是两个实际参数。 第二个函数:swap1 实际上是在对两个形参的值进行交换,不影响到实参的变化,如果要改变实参的值,必须传地址。
作者:
罗文杰
时间:
2012-5-30 21:59
{:soso_e113:}衷心谢谢楼上各位,第二个函数没有任何作用,形参的代入无法作用到实参上面,除非利用指针等操作,而形参改变完,也在内存中释放掉了。了解了 {:soso_e182:}
作者:
龙秋地
时间:
2012-5-30 22:13
首先回答你的"使用swap1(arr[1],arr[10]),为什么两个值不能换,这样代入数组元素跟第一个函数的区别是什么?"这个问题.
首先你第二个函数的形式参数是两个整型变量.函数的功能是将两个值分别调换.
你传入的arr[1]和arr[10]是数组中的两个值,所以调换的只是数组中的值.但是内存地址没有变.所以你实际的数组是不会变的.
其次,第一个函数的作用是将数组和数组下标作为形式参数.当你传入数组时,其实传入的是内存地址(很类似于c语言的指针),
就是数组首地址指向于堆内存中的数组,可以直接操作堆内存中数组.所以你调换之后,两个值的内存地址也改变了.所以就调换成功.
感觉自己说的罗里吧嗦的,不过希望楼主能仔细细思考一下,想明白!!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2