我仍然不太了解指针在 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;
指针到底发生了什么?
最佳答案
PHostEnt
是一个指向 hostent
的指针,Windows API 中定义的类型。 h_addr_list 是一个 PAnsiChar 值数组,它实际上是一个字节数组(在 C 中,字符和字节是同一件事,这使处理字节缓冲区的 C API 变得复杂)。
这句话的意思是:
- varPHostEnt^:取消引用指向主机的指针
- h_addr_list^:取消引用指向字节数组的指针,获取第一个成员
- pu_long 转换:将第一个成员(字节数组指针)解释为 ulong 指针
- pu_long()^:取消引用该指针并获取它指向的ulong
- ulong 转换:不必要,因为我们已经在处理 ulong
- S_addr := in_addr 记录是一种变体类型,可以解释为 uint32(4 字节无符号整数)或 4 个单独字节的数组。将此 ulong(4 字节无符号整数)分配给前一种解释。
关于delphi - 这段代码对指针做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257040/