为什么参数发送到函数会发生变化

问题描述 投票:0回答:3

我记得在谈论函数传递参数时,据说参数在函数执行期间不会改变它的值。但在我的例子中,我观察到我的初始参数值发生了变化:

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#
3个回答
6
投票

据说参数不会改变它的值

这是对的*。你在这里的困惑可能是因为你误解了这里的“改变”意味着什么。

C#中的数组是引用类型。这意味着数组类型的变量不存储数组本身,而是存储实际数组的引用,实际数组位于内存中的其他位置。

a的值不是数组,它是参考。只要a指的是同一个数组,我可以说a的值没有改变。

在你的方法中,你可能做了类似的事情:

a[0] = <something else>;

这不是修改a的值。您正在修改实际的数组对象。修改a的值将是这样的:

a = new int[10]; // a now references a new array

所以这就是变化反映的原因 - 只有一个数组可以开始,参数a和局部变量a都参考了这一点。


*实际上,如果使用ref修饰符,则可以更改参数的值,因为它是通过引用传递的。


0
投票

.NET中的数组是堆上的对象,因此您有一个引用。

该引用按值传递,调用者将看到ergo对数组内容的更改,但是数组的重新分配不会

//排序过程,在此期间,c []和a []都在变化

不要改变a[x],问题排序。


0
投票

应该是这样的。你应该避免返回数组,只需将它作为引用/指针传递。还忘记了所有关于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;
}
© www.soinside.com 2019 - 2024. All rights reserved.