2012-12-17 78 views
1

的意思我有一段代碼,說是什麼(無效*)

clock.start(); 
for (unordered_map <uint32_t,HostTraffic>::iterator internalIPItr = hostTraffic.begin(); 
    internalIPItr != hostTraffic.end(); 
    ++internalIPItr) 
    { 
    if (!pgBulkInserter.insert(NULL, internalIPItr -> first, 
           internalIPItr -> second.inboundFlows, 
           (void*)&(internalIPItr -> second.outboundPortIPs), 
           internalIPItr -> second.roles)) { 
     return -1; 
    } 
    clock.incrementOperations(); 
    } 

我的問題是我不明白的

(void*)&(internalIPItr -> second.outboundPortIPs). 

意思你可以考慮for(....)

for (int internalItr = beginning -> end) 

其中internalItr類型是unordered_mapinternalItr->second給出HostTraffic的實例。

回答

2

指向地址internalIPItr->second.outboundPortIPs的指針由&給出,轉換爲void*

+0

爲什麼我需要它或它有什麼優勢? – smttsp

+0

當函數(在你的情況下:pgBulkInserter.insert)需要一個參數時,通常使用它,但不能事先確定參數的確切類型。例如:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686736(v=vs.85).aspx – kol

1

您正在將一個指針傳遞給internalIPItr->second.outboundPortIPs,該函數需要void*

&的地址爲internalIPItr->second.outboundPortIPs(即給你一個指向它的指針)。 (void*)指向void

1

internalPltr是一個指向結構的指針,它有一個名爲second的成員,它有一個名爲outboundPortIPs的成員。 &(addressof)運算符返回其內存地址,然後(void *)將該地址強制轉換(執行顯式類型轉換)爲void指針。

+0

嗯,但爲什麼要明確強制轉換爲'void *'? –

0

已經回答是它做什麼(返回void*

但是,你應該事先警告這這種類型的鑄件被稱爲「雙關型」和它被認爲是未定義的行爲。 (儘管它適用於我所知道的所有編譯器,但是它們適用於編譯選項集或未設置。)