通过引用数组来传递堆栈分配的参数
我有一个函数说无效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