2012-12-17 71 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*

但是,你应该事先警告这这种类型的铸件被称为“双关型”和它被认为是未定义的行为。 (尽管它适用于我所知道的所有编译器,但是它们适用于编译选项集或未设置。)