如何解决将指针分配给NativeInt会导致E2010类型不兼容
将Pointer
分配给NativeInt
变量会导致E2010编译:
var
Test : string;
Ptr : Pointer;
LocTag : NativeInt;
begin
Test := 'Hello World';
Ptr := @Test;
LocTag := Ptr;
end;
[dcc32错误] Unit1.pas(34):E2010不兼容的类型:'NativeInt'和 “指针”
我特别阅读了Pointer
documentation:
指针的大小取决于操作系统和/或 处理器。在32位平台上,指针以4 32位地址。在64位平台上,指针以8个字节的形式存储为 一个64位地址。
还有NativeInt
documentation,尤其是:
NativeInt代表整数的子集。范围 NativeInt取决于当前平台。在32位平台上, NativeInt等效于Integer类型。在64位平台上, NativeInt等效于Int64类型。
NativeInt的大小等于指针在指针上的大小。 当前平台
为什么分配会导致E2010错误?
类型转换(Tag := NativeInt(Ptr);
)是正确的解决方案吗?
解决方法
为什么分配会导致E2010错误?
因为整数和指针并不完全相同。指针是指向内存中某个位置的东西。整数不需要这样做(即使它恰好具有与指针相同的大小)。这是关于类型安全性,并确保您不会出错。通过使用显式强制转换(您必须执行此强制转换),您可以告诉编译器,任何阅读您的代码的人以及您自己,您都知道自己在做什么。
类型转换(
Tag := NativeInt(Ptr);
)是正确的解决方案吗?
是的,这确实是正确的事情。这也是绝对安全的,因为(NativeInt
)整数的宽度等于指针的宽度。
正确的解决方案是类型转换(Tag:= NativeInt(Ptr);)吗?
它将起作用,但是我认为最好使用类型UIntPtr
,该类型已定义为表示一个无符号整数,其值是一个指针。
UIntPtr
用于将指针作为无符号整数使用。
如果您查看UIntPtr
的定义,它是NativeUInt
的别名。
还有一个IntPtr
,它是NativeInt
的别名。这显然也可以。
使用UIntPtr
比其他任何方法都更清楚,如果以后使用变量执行指针算术,则更合适。当指针指向高内存(32位地址空间中2GB以上)时,这可以避免意外的结果,因为在这种情况下,整数变为负数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。