这段代码用指针做什么?

Jer*_*dge 3 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;
Run Code Online (Sandbox Code Playgroud)

指针到底发生了什么?

Mas*_*ler 6

PHostEnt是指向a hostent,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字节无符号整数)分配给前一解释.

  • 不要得到那个回滚...... Remy的解释是什么`h_addr_list`类型确实是准确的.现在你又错了.你所陈述的并不是"一系列的PAnsiChar".[此处无投票] (3认同)