void foo(void **Pointer);
int main()
{
int *IntPtr;
foo(&((void*)IntPtr));
}
为什么会出现错误?如何在C++中投射指针
error: lvalue required as unary ‘&’ operand
感谢
void foo(void **Pointer);
int main()
{
int *IntPtr;
foo(&((void*)IntPtr));
}
为什么会出现错误?如何在C++中投射指针
error: lvalue required as unary ‘&’ operand
感谢
(void *的)是不是一个左值,这是怎样的一个铸造运营商,你需要有符号的即时左边的变量(左值)。 这应该是正确的:
foo(((void**)&IntPtr));
void foo(void **Pointer);
int main()
{
int *IntPtr;
foo((void**)&IntPtr);
}
当你
(void*)IntPtr
您创建一个临时变量,这是只有一个右值,所以不能被解除引用。
你需要做的是:
int main()
{
int* IntPtr;
void* VoidPtr = (void*)IntPtr;
foo(&VoidPtr);
}
或同等
但是,值得注意的是,在foo中对指针进行的每个修改只会影响VoidPtr而不会影响IntPtr(因为我猜这是OP的目标)。 – 2009-01-20 13:47:59
是的,这个解决方案是不正确的。您只将IntPtr的(未初始化)值复制到赋值中的VoidPtr。您没有将VoidPtr指向IntPtr。你想做void * VoidPtr =(void *)(&IntPtr); – 2009-01-20 14:55:05
这不会按预期工作。您需要添加最后一步将conetent从VoidPtr复制回IntPtr – 2009-01-20 16:37:08
更多C++风格:
foo(reinterpret_cast< void** >(IntPtr));
但要记住,根据标准这样的转换是实现特定的。标准不保证此类演员的行为。
正如其他人指出的那样,您的演员阵容和&
错误。但为什么你根本用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++有一些可用的好工具,包括模板和重载,在这种情况下,这两种工具都很有帮助。
不需要转换void * – crashmstr 2009-01-20 13:15:57