调用函数时传递给函数的是指针的副本,而不是原始数据。这意味着函数可以使用指针来访问和更改原始数据,从而影响调用函数的代码中的变量。
当我写下
void foo(int &a,int &b)
当我写下
时
foo(p,q)
函数实际传递的是什么?它是p和q的地址吗?
void foo(int &a,int &b)
时
foo(p,q)
函数实际传递的是什么?它是p和q的地址吗?
你正在传递一个引用,它不是指针,也不是地址,但它很相似。
“引用”到底是什么并没有明确的定义。标准并没有规定处理引用的机制,只规定了使用引用的后果。通常情况下,它们会被实现为指针。
例如:
int foo(int& a, int& b) { a = b; }
// Usage
int x, y;
foo(x, y);
这可能会生成与以下代码相同的机器码:
int foo(int* a, int* b) { *a = *b; }
// Usage
int x, y;
foo(&x, &y);
但是这并不保证,两者并不等价(尽管它们提供类似的功能)。
当您获取引用的地址时,您将获得与其所引用的对象相同的地址。例如:
void foo(int& x) { std::cout << &x << std::endl; }
int y;
std::cout << &y << std::endl;
foo(); // This will print the same as above.
传递引用的方式由编译器定义。无论如何,它们都被传递为int&
,这是C++中的实际类型。请尝试以下代码:
int x = 10;
int& y = x;
x = 100;
你认为 y 的值是多少?引用不完全是指针,而是变量的别名。编译器应用于 int&
的相同机制也用于按引用传递的参数。
给定以下程序:
void byRef(int& x)
{
return;
}
void byVal(int x)
{
return;
}
void byPtr(int * x)
{
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
int x = 0;
byRef(x);
byVal(x);
byPtr(&x);
return 0;
}
byRef
和byPtr
调用生成的MSVC90汇编代码完全相同,如下所示:
lea eax, [x]
push eax
call byRef ;or byPtr
add esp, 4