我有一个函数说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并存储在一个动态存储的数组中。我知道对象/参数不能只在堆栈和堆之间移动,因为它们具有特定的存储内存地址。我想理解为什么这样做,以及幕后发生的事情(如果这种情况与传递值有所不同)。
谢谢!
答案 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)。