我有一个函数say void thefunc(int num& int* array),该函数通过参考和数组指针
gotetheFunc(int num&, int* array)
{ array[0] = num;
}
这只是一个示例,因此该函数执行一些简单的事情
int main()
{ int k = 3;
int* theArray = new int[5];
theFunc(k, theArray);
delete[] theArray;
return(0);
}
我的问题是,k是一个分配的int实例,是如何通过参考thefunc传递的,并存储在动态存储的数组中。我知道对象/参数不能仅仅在堆栈和堆之间移动,因为它们具有特定的存储内存地址。我想了解为什么这有效,以及在引擎盖下发生的事情(如果这种情况与通过价值传递有所不同)。
谢谢!
简短的答案是,k
没有被"存储"在动态分配的数组中。相反,当您编写int *theArray = new int[5]
时,您将分配一个可以容纳五个整数数组的内存块。实际上,它已经 do 持有五个整数:没有做其他事情, theArray[0]
是一个有效的表达式,即它是一个整数,尽管其值可能为 -32,768
或类似的东西。当您以k
的引用调用theFunc
时,您将theArray[0]
的值更改为k
的复制分配,因此您将k
的值分配给数组的第一个元素。您没有存储任何新的东西,而只是在更改已经存储的东西的价值。
的确,在这种特殊情况下,通过引用传递num
,没有获得或丢失。如果函数的书面行为可观察到的行为,如果按值通过值将相同。
您的变量k存在于堆栈上,这只是程序正在使用的一大笔内存。因此,每个堆栈条目仍然作为可寻址的内存位置存在。
呼叫thefunc时,将k的地址推到呼叫堆栈上,并在thefunc中弹出。当您将分配分配到数组位置时,将NUM(或K)的值(表示传递的地址的值)复制到数组中。
在这种情况下,由于Func没有更改NUM(或K),因此通过值将具有相同的效果。