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