2009-01-20 110 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++有一些可用的好工具,包括模板和重載,在這種情況下,這兩種工具都很有幫助。