通过参考数组传递分配的堆栈参数



我有一个函数say void thefunc(int num& int* array),该函数通过参考和数组指针

gote
theFunc(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),因此通过值将具有相同的效果。

最新更新