【发布时间】:2020-09-28 09:01:33
【问题描述】:
将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' 和 '指针'
我读过Pointerdocumentation,尤其是:
指针的大小取决于操作系统和/或 处理器。在 32 位平台上,指针存储在 4 个字节上作为 32 位地址。在 64 位平台上,指针存储在 8 个字节上 64 位地址。
还有NativeIntdocumentation,特别是:
NativeInt 表示整数的子集。的范围 NativeInt 取决于当前平台。在 32 位平台上, NativeInt 等价于 Integer 类型。在 64 位平台上, NativeInt 等价于 Int64 类型。
NativeInt 的大小相当于指针的大小 当前平台
为什么赋值会导致 E2010 错误?
类型转换 (Tag := NativeInt(Ptr);) 是正确的解决方案吗?
【问题讨论】:
-
虽然有点离题,但可能值得指出的是,在实践中,您很少需要使用字符串
S中的@S。对PChar(S)感兴趣更为常见,这与@S[1]相同,除非S为空。 -
另一个题外话:如果 S 是一个字符串,那么 @S 和 PChar(S) 具有完全不同的值。字符串实际上是由具有几个字段的记录实现的。一个是指向字符串第一个字符的指针,或者字符串的 nil 为空。 @S 返回指向记录的指针,而 PChar(S) 返回记录中指向字符的字段(nil 为空字符串,@S[1] 如果不为空)。
-
@fpiette:实际上,这种描述并不准确。字符串变量是一个指针。如果字符串非空,则 this 指向字符串堆对象的第一个字符。在第一个字符之前,您有一些关于字符串的元数据:长度、引用计数和代码页。
@S是指针的地址。PChar(S)是字符串堆对象的第一个字符的地址。如果S是空字符串,则变量是nil指针。 ... -
(续)这里是an image,这里是documentation。
-
函数返回时字符串被销毁不是真正的问题,现在
Tag持有一个过时的指针。
标签: pointers delphi delphi-xe7