You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pascal中通过指针访问不同数据类型?字节指针转字指针问题求解

解决Pascal中字节指针转Word指针取值的问题

正确实现方式

对应你给出的两种C语言写法,Pascal里可以这样实现:

方法1:对应C的*(uint16_t*)(P1+byteoffset)

type 
  WordPtr = ^Word;
var 
  P1: ^Byte; 
  w, byteoffset: Word;
begin
  P1 := SomeGetMemVar;
  byteoffset := 8;
  // 将字节指针转换为地址数值,加上偏移后再转成Word指针取值
  w := WordPtr(PtrUInt(P1) + byteoffset)^;
  // 若使用Delphi,也可以用NativeInt:
  // w := WordPtr(NativeInt(P1) + byteoffset)^;
end;

方法2:对应C的*(uint16_t*)(&P1[byteoffset])

type 
  WordPtr = ^Word;
var 
  P1: ^Byte; 
  w, byteoffset: Word;
begin
  P1 := SomeGetMemVar;
  byteoffset := 8;
  // 先取偏移位置字节的地址,再转成Word指针取值
  w := WordPtr(@(P1^[byteoffset]))^;
  // 部分编译器(如Delphi)支持直接写P1[byteoffset],等价于P1^[byteoffset]
  // w := WordPtr(@P1[byteoffset])^;
end;

为什么你的写法报错?

  • w:=WordPtr(@P1^[byteoffset])^:@的优先级高于^,实际执行的是(@P1)^[byteoffset],相当于把指针P1的地址当成数组访问,完全不符合预期。加括号@(P1^[byteoffset])才能正确取到偏移位置字节的地址。
  • w:=WordPtr(P1[byteoffset])^:P1[byteoffset]返回的是Byte类型的数值,不是指针,强行转成WordPtr会因类型不匹配报错,需要取它的地址(用@)再转换。
  • w:=WordPtr(P1+byteoffset)^:Pascal中P1+byteoffset返回的还是^Byte类型指针,部分编译器不允许直接将^Byte强制转换为^Word,需要先转成地址数值类型(如PtrUInt、NativeInt)再转成目标指针类型。

注意事项

  • 不同Pascal编译器的细节可能有差异:PtrUInt是Free Pascal和Delphi都支持的无符号地址类型,NativeInt是Delphi的有符号地址类型,可根据使用的编译器选择。
  • 要确保内存偏移后的位置有足够的空间容纳Word类型(至少2字节),避免越界访问。

内容的提问来源于stack exchange,提问作者user3161924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 06:06:45