0

我想使用一个简单的函数(sqr 表示数字)

function stepenadr(adresss:pointer):real;
begin
stepenadr:=adresss^*adresss^;
end;

通过使用实变量的地址

 adress:=@x1;

像这样:

writeln(x1,'^',2,'=',stepenadr(adress));

但是它给了我错误,例如无法完成此操作,或者无法命名指针。地址是一个

adress :pointer;

也不能这样工作:

function stepenadr(adresss:pointer):real;
begin
stepenadr:=adresss*adresss;
end;
4

2 回答 2

3

无类型指针指向匿名空记录,可以通过运行以下程序查看:

var p  :pointer;
begin
  writeln (sizeof(p^)); // will print 0
end.

无类型指针的优点是它可以接受任何信息,但是在将类型指针分配给无类型函数的过程中,它所指向的信息(类型)会丢失。正如你所发现的。

解决方案是保持它的类型,或者在极少数情况下进行类型转换:

type preal=^real;

function stepenadr(adresss:pointer):real;
begin
  stepenadr:=preal(adresss)^*preal(adresss)^;
end;

它向编译器解释了如何解释指针(作为preal),然后再次定义指针指向的类型。

尽管如果地址最初没有指向真实,这可能会发生灾难性的错误,因为那时编译器可能会将随机存储器解释为真实的。

于 2013-05-23T17:23:05.807 回答
0

没关系,通过这样做让它工作:

function stepenadr(adress:^real):real;
begin
stepenadr:=adress^*adress^;
end;

adress:=@x1;
writeln(x1,'^',2,'=',stepenadr(adress));
于 2013-05-23T15:32:16.827 回答