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

时间:2016-12-07 00:57:58

标签: c++ arrays stack heap dynamic-allocation

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

<div class="dynamicWidth">
  <div>
    <select>
      <option>This could be longer or shorter dependending on what is dynamically loaded</option>
    </select>
  </div>
  <hr>
  <div>
    <span>Length</span>
    <input type="text" placeholder="length"><span> x Width</span>
    <input type="text" placeholder="width"><span> x Height</span>
    <input type="text" placeholder="height">
  </div>
</div>

这只是一个例子,所以函数做了一些简单的事情

theFunc(int num&, int* array)
{ array[0] = num; 
}

我的问题是k是一个堆栈分配的int实例,通过引用传递给theFunc并存储在一个动态存储的数组中。我知道对象/参数不能只在堆栈和堆之间移动,因为它们具有特定的存储内存地址。我想理解为什么这样做,以及幕后发生的事情(如果这种情况与传递值有所不同)。

谢谢!

2 个答案:

答案 0 :(得分:1)

简短的回答是k没有“存储”在动态分配的数组中。相反,当你编写int *theArray = new int[5]时,你正在分配一个可以容纳五个整数数组的内存块。实际上它已经确实拥有五个整数:没有做任何其他事情,theArray[0]是一个有效的表达式,即它是一个整数,虽然它的值可能是-32,768或者其他什么像那样。当您通过引用theFunc致电k时,您正在通过复制分配theArray[0]的值更改为k,因此您要分配k的值对数组的第一个元素。您没有存储任何新内容,只是更改已存储的内容的值。

事实上,在这种特殊情况下,通过引用传递num没有任何好处或丢失。如果通过值传递,则所写函数的可观察行为将是相同的。

答案 1 :(得分:0)

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

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

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