我记得在谈论函数传递参数时,据说参数在函数执行期间不会改变它的值。但在我的例子中,我观察到我的初始参数值发生了变化:
public static void main()
{
int[] a = new int[]{some int array};
int[] b = SortArray(a);
Output(a);
}
internal static int[] SortArray(int[] a)
{
int[] c = new int[a.length];
//Sort process, during which, both c[] and a[] are changing
return c;
}
当执行Output(a);
时,我发现我的a
不再是原来的了。这里的诀窍是什么?
据说参数不会改变它的值
这是对的*。你在这里的困惑可能是因为你误解了这里的“改变”意味着什么。
C#中的数组是引用类型。这意味着数组类型的变量不存储数组本身,而是存储实际数组的引用,实际数组位于内存中的其他位置。
a
的值不是数组,它是参考。只要a
指的是同一个数组,我可以说a
的值没有改变。
在你的方法中,你可能做了类似的事情:
a[0] = <something else>;
这不是修改a
的值。您正在修改实际的数组对象。修改a
的值将是这样的:
a = new int[10]; // a now references a new array
所以这就是变化反映的原因 - 只有一个数组可以开始,参数a
和局部变量a
都参考了这一点。
*实际上,如果使用ref
修饰符,则可以更改参数的值,因为它是通过引用传递的。
.NET中的数组是堆上的对象,因此您有一个引用。
该引用按值传递,调用者将看到ergo对数组内容的更改,但是数组的重新分配不会
//排序过程,在此期间,c []和a []都在变化
不要改变a[x]
,问题排序。
应该是这样的。你应该避免返回数组,只需将它作为引用/指针传递。还忘记了所有关于java数组声明(括号的顺序)
public static void main()
{
int a[] = {3,1,2};
int* sorted = SortArray(a, a.length);
Output(sorted);
delete[] sorted;
}
internal static int* SortArray(int* a, int length)
{
int* c = new int[length];
//Sort process, during which, both c[] and a[] are changing
return c;
}