这段代码用指针做什么?

时间:2014-04-23 23:29:54

标签: delphi pointers casting

我仍然不太了解指针如何在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;

指针究竟发生了什么?

1 个答案:

答案 0 :(得分:6)

PHostEnt是指向hostent的指针,{{3}}是Windows API中定义的类型。 h_addr_list是一个PAnsiChar值的数组,它实际上是一个字节数组(在C中,char和一个字节是相同的,这使得处理字节缓冲区的C API变得复杂)。

这是说什么:

  • varPHostEnt ^:取消引用指向hostent的指针
  • h_addr_list ^:取消引用指向字节数组数组的指针,获取第一个成员
  • pu_long cast:将第一个成员(一个字节数组指针)解释为ulong指针
  • pu_long()^:取消引用此指针并获取指向
  • 的ulong
  • ulong cast:不必要,因为我们已经处理了ulong
  • S_addr:= in_addr记录是一种变体类型,可以解释为uint32(4字节无符号整数)或4个单独字节的数组。将此ulong(4字节无符号整数)分配给前一种解释。