【发布时间】:2014-04-23 23:29:54
【问题描述】:
我仍然没有很好地理解指针在 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;
指针到底发生了什么?
【问题讨论】:
-
这里的错误检查是一团糟,fwiw。 WSACleanup 在错误的地方调用。对 gethostname 或 gethostbyname 没有错误检查。确实需要修复。
-
FWIW,一个无耻的插件,可能有助于理解指针:rvelthuis.de/articles/articles-pointers.html(“寻址指针”)。
-
那必须停在别处。该网站目前不受我控制,因此请改用praxis-velthuis.de/rdc/articles/articles-pointers.html。