通过引用数组传递堆栈分配的参数
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
不会有任何收获或损失。如果函数是按值传递的,那么所写函数的可观察行为将是相同的。
我有一个函数 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
不会有任何收获或损失。如果函数是按值传递的,那么所写函数的可观察行为将是相同的。