通过引用数组来传递堆栈分配的参数

我有一个函数说无效theFunc(int num&,int *数组),它通过引用接受一个int和一个数组指针

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实例,通过引用传递给Func并存储在一个动态存储的数组。 我知道对象/参数不能在栈和堆之间移动,因为它们具有特定的存储内存地址。 我想知道为什么这会起作用,以及发生了什么(如果这种情况与通过值传递有所不同)。

谢谢!


简短的回答是, k没有被“存储”在动态分配的数组中。 相反,当你编写int *theArray = new int[5]你正在分配一个可以容纳五个整数数组的内存块。 事实上,它已经包含了五个整数:除了别的以外, theArray[0]是一个有效的表达式,即它是一个整数,尽管它的值可能是-32,768或类似的东西。 当你调用带有k的引用的theFunc ,通过复制赋值将array theArray[0]的值更改为k ,因此您将k的值分配给数组的第一个元素。 你没有储存任何新东西,你只是在改变已存储的东西的价值。

事实上,在这个特定的情况下,通过引用num来获得或失去任何东西。 如果按值传递,那么函数的可观察行为将是相同的。


您的变量K存在于堆栈中,它只是程序正在使用的一块内存。 因此,每个堆栈条目仍然作为可寻址的内存位置存在。

当你调用函数时,K的地址被压入调用堆栈,并在函数中弹出。 在对数组位置进行赋值时,将num(或K)的值(即传入的地址处的值)复制到数组中。

在这种情况下,由于函数没有改变num(或K),因此按值传递将具有相同的效果。

链接地址: http://www.djcxy.com/p/82709.html

上一篇: Passing a stack allocated argument by reference to an array

下一篇: Pushing a 2d array onto a C++ STL stack?