通过函数内的指针更改值

时间:2013-05-23 15:19:19

标签: pascal

我想使用一个简单的函数(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;

2 个答案:

答案 0 :(得分: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),然后再次定义指针指向的类型。

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

答案 1 :(得分:0)

没关系,通过这样做得到它:

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

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