我理解调用foo(value)很好,但调用foo(* p)如何产生相同的结果?我认为这会错,但它的工作正常。
* p取消引用指针,在p中存储的地址获得值,所以它不等同于调用foo(5)吗?
void foo(int &ptr)
{
ptr = 6;
}
int main()
{
using namespace std;
int value = 5;
int *p = &value;
cout << "value = " << value << '\n';
foo(*p);
cout << "value = " << value << '\n';
return 0;
}
答案 0 :(得分:1)
*
运算符返回 lvalue ,就像代表value
这样的变量的标识符一样,这是一个主要表达式。因此,它们都将被接受作为参考参数。
引自N3337 5.1.1一般(5.1主要表达式):
8 标识符是一个id表达式,只要它已被适当声明(第7条)。 [...]表达式的类型是标识符的类型。 结果是由标识符表示的实体。如果实体是一个函数,变量,结果是一个左值 或者数据成员和prvalue否则。
引自N3337 5.3.1一元运算符:
1 一元*运算符执行间接:它所应用的表达式应该是指向一个的表达式 对象类型或指向函数类型的指针,结果是引用对象或函数的左值 表达点所指向的。如果表达式的类型是“指向T的指针”,则结果的类型为“T”。
答案 1 :(得分:1)
首先,当您取消引用指针p时,会得到一个整数值(因为您将其声明为指向整数的指针)。在这种情况下,解除引用p会获得“值”变量的值。和我一起到目前为止?
现在,函数调用会发生什么?程序取消引用指针p,然后将一个左值引用传递给函数的变量(值)。该函数被定义为引用(带有一些语法糖的指针)。所以是的,你认为它被解除引用整数是正确的。但是,C ++无论如何都会传递值变量的地址,而不是整数变量,因为你已经告诉它只接受函数中的引用。