将临时指针传递给指向对象的临时指针

时间:2014-01-20 10:47:34

标签: c++ pointers visual-studio-2012 parameter-passing

#include <iostream>
#include <tchar.h>

void output(int *param)
{
    std::cout << "Value: " << *param << std::endl;
};

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 34;

    output(&i);

    return 0;
}

显然将“Value:34”写入控制台。

但如果我做了以下更改

...
void output(int **param)
{
    std::cout << "Value: " << **param << std::endl;
}
...
    output(&(&i));
...

我收到编译错误“'&amp;'需要l值“。

顺便说一句,我甚至试图做出以下改变:

output(&34);

确实这感觉错了......不知怎的。

我的问题是:为什么这是不允许使用&amp;在一个r值?汇编程序级别有什么理由吗?

2 个答案:

答案 0 :(得分:2)

您正在尝试获取地址的地址,而地址不是l值。 (你可以非常粗略地将l值视为可以站在操作左侧的值。变量和“命名值”是l值,例如)

将第一个地址存储在某处。

int number = 4;
int* firstAddress = &number;
int** secondAddress = &firstAddress;

output(secondAddress);

答案 1 :(得分:2)

您正在尝试获取对r值的引用,并且基本上没有定义,因为它始终是临时值,实际上从不在堆栈/堆上有地址。这就是为什么C ++ 11引入了r值引用,但这与你的问题完全不同。

要获取代码以编译您需要执行以下操作:

int   i = 34;
int* pi = &i;

output(&ip);

通过在pi中“接地”引用,可以为编译器提供可以赋予output的堆栈的实际地址。