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

Passing a stack allocated argument by reference to an array

我有一个函数 void theFunc(int num&, int* array) 通过引用接受一个 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 实例,如何通过引用传递给 theFunc 并存储在一个动态存储的数组中。我知道 objects/argument 不能只在栈和堆之间移动,因为它们有特定的存储内存地址。我想了解为什么会这样,以及幕后发生了什么(如果在这种情况下与按值传递有区别的话)。

谢谢!

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

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

在这种情况下,按值传递会产生相同的效果,因为 theFunc 不会更改 num(或 K)。

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

确实,在这种特殊情况下,通过引用传递 num 不会有任何收获或损失。如果函数是按值传递的,那么所写函数的可观察行为将是相同的。