我仍然不太了解指针如何在Delphi中工作。在查看我的库时,在我使用通常称为GetIPAddress
(用于获取本地机器的IP地址)的函数中,我遇到了一个使用指针的奇怪演员(下面标记的行)。我没有写这个,但一段时间后发现它...
uses
Winsock;
function GetIPAddress: string;
type
pu_long = ^u_long;
var
varTWSAData: TWSAData;
varPHostEnt: PHostEnt;
varTInAddr: TInAddr;
namebuf: array [0 .. 255] of ansichar;
begin
try
try
if WSAStartup($101, varTWSAData) <> 0 then Result := ''
else begin
gethostname(namebuf, sizeof(namebuf));
varPHostEnt := gethostbyname(namebuf);
varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^); //<--- ???
Result := WideString(inet_ntoa(varTInAddr));
end;
except
Result := '';
end;
finally
WSACleanup;
end;
end;
指针究竟发生了什么?
答案 0 :(得分:6)
PHostEnt
是指向hostent
的指针,{{3}}是Windows API中定义的类型。 h_addr_list是一个PAnsiChar值的数组,它实际上是一个字节数组(在C中,char和一个字节是相同的,这使得处理字节缓冲区的C API变得复杂)。
这是说什么: