【发布时间】:2019-11-09 10:30:37
【问题描述】:
我想了解将参数按值传递给函数时发生的情况。这个“函数复制值”是怎么做的?
我希望这是传递数组与传递两个变量之间的并行。
我搜索了一些线程,我认为this 最适合这些线程,但我还有其他问题。
这里有两个例子:
Ex1:
void function(int arr[])
{
cout << arr << endl; // The address of the first elm
cout << sizeof(arr); // 4 (bytes size of address on 32 bit)
}
int main()
{
int vector[] = {1,2,3,4,5,6,7};
function(vector);
return 0;
}
Ex2:
void interChange(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 5, b = 3;
interChange(a, b);
return 0;
}
在第一个中,我想表明,即使我按值传递数组,它仍然被解释为指针(允许修改函数以改变实际的 vector 值),这就是为什么打印数组会输出一个地址,打印它的大小会输出一个指针的维度。
在第二个示例中,参数是按值传递的,但这次它们不会改变变量a 和b 的值。这个过程是如何发生的?为什么他们被复制而不是使用他们的地址呢?编译器是否考虑到它们的地址?如果我在main() 中打印&a,然后在interChange 中打印,我会得到两个彼此非常接近的地址,例如:0x69fed8、0x69fe80。
【问题讨论】:
-
您可以使用godbolt.org 看看会发生什么
-
他们是两个不同的例子。其中之一对地址进行操作。我想看看它们是否以某种方式相互关联,或者它们完全不同。
-
在第一个示例中,您按值将指针传递给函数。在第二个示例中,您通过值将两个数字传递给函数。你的问题不清楚。转到 godbolt.org,粘贴您的代码,您可以看到 CPU 中发生了什么。地址很接近,因为变量在堆栈上,并且两个堆栈帧彼此相邻。
-
在主函数的堆栈帧中,CPU 将值复制到寄存器中。它为函数创建一个新的堆栈帧并从寄存器中读取值。
-
注意,如果你想让一个函数对传入的变量而不是副本进行操作,那么你可以将参数设为references。
标签: c++ function parameters