2009-01-20 78 views
3
void foo(void **Pointer); 

int main() 
{ 
    int *IntPtr; 

    foo(&((void*)IntPtr)); 
} 

为什么会出现错误?如何在C++中投射指针

error: lvalue required as unary ‘&’ operand 

感谢

回答

4

(void *的)是不是一个左值,这是怎样的一个铸造运营商,你需要有符号的即时左边的变量(左值)。 这应该是正确的:

foo(((void**)&IntPtr)); 
+0

不需要转换void * – crashmstr 2009-01-20 13:15:57

8
void foo(void **Pointer); 

int main() 
{ 
    int *IntPtr; 

    foo((void**)&IntPtr); 
} 
7

当你

(void*)IntPtr 

您创建一个临时变量,这是只有一个右值,所以不能被解除引用。

你需要做的是:

int main() 
{ 
    int* IntPtr; 
    void* VoidPtr = (void*)IntPtr; 
    foo(&VoidPtr); 
} 

或同等

+0

但是,值得注意的是,在foo中对指针进行的每个修改只会影响VoidPtr而不会影响IntPtr(因为我猜这是OP的目标)。 – 2009-01-20 13:47:59

+0

是的,这个解决方案是不正确的。您只将IntPtr的(未初始化)值复制到赋值中的VoidPtr。您没有将VoidPtr指向IntPtr。你想做void * VoidPtr =(void *)(&IntPtr); – 2009-01-20 14:55:05

+0

这不会按预期工作。您需要添加最后一步将conetent从VoidPtr复制回IntPtr – 2009-01-20 16:37:08

2

更多C++风格:

foo(reinterpret_cast< void** >(IntPtr)); 

但要记住,根据标准这样的转换是实现特定的。标准不保证此类演员的行为。

2

正如其他人指出的那样,您的演员阵容和&错误。但为什么你根本用void**?这意味着您接受指向无效指针的指针。但那不是你想要的。只是使参数void*,它会接受任何指向某个对象:

void foo(void*); 

int main() { 
    int *IntPtr; 
    foo(&IntPtr); 
    assert(IntPtr == NULL); 
} 

这就是void*是。稍后,使用static_cast将其重新投入使用。这是一个相当严格的铸件,不允许危险的变种,与C风格的转换(类型)

void foo(void* p) { 
    int** pint = static_cast<int**>(p); 
    *pint = NULL; 
} 

如果函数采用指针void*,那么该功能无法接受指针int* 。但是,如果函数接受或者,那么函数应该接受void*,并且您应该在函数内部转换为适当的类型。也许粘贴你真正想要做的事,那么我们可以帮助你更好。 C++有一些可用的好工具,包括模板和重载,在这种情况下,这两种工具都很有帮助。