delphi - 这段代码对指针做了什么?

标签 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;

指针到底发生了什么?

最佳答案

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/

相关文章:

delphi - Delphi 中的返回值检索是否有任何优化?

c - 将 char 指针类型转换为整数指针

c++ - 返回引用后,数组中的值(它是对象的属性)被垃圾替换

c++ - VC++中的指针运算(三重指针赋值)

Java 如何处理对象中的 Array<MyItem> 的 "Unchecked cast"

c++ - 强制转换为派生类的 ptr 到 ptr

Delphi 7 继续使用旧的过时的形式

delphi - 为什么 Delphi 中的类不能使用运算符重载?

Delphi兼容性问题

java - 将字符串转换为 JInternalFrame