C ++将指针传递给带参考参数的函数

时间:2016-03-07 00:15:48

标签: c++ pointers

我理解调用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;
}

2 个答案:

答案 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 ++无论如何都会传递值变量的地址,而不是整数变量,因为你已经告诉它只接受函数中的引用。