Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pascal 在函数中通过指针更改值_Pascal - Fatal编程技术网

Pascal 在函数中通过指针更改值

Pascal 在函数中通过指针更改值,pascal,Pascal,我想使用一个简单的函数(sqr表示数字) 通过使用实变量的地址 adress:=@x1; 像这样: writeln(x1,'^',2,'=',stepenadr(adress)); 然而,它给了我一些错误,比如这个操作不能完成,或者它不能改变指针的名称。地址是a adress :pointer; 也不能像这样工作: function stepenadr(adresss:pointer):real; begin stepenadr:=adresss*adresss; end; 没关系,通

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

通过使用实变量的地址

 adress:=@x1;
像这样:

writeln(x1,'^',2,'=',stepenadr(adress));
然而,它给了我一些错误,比如这个操作不能完成,或者它不能改变指针的名称。地址是a

adress :pointer;
也不能像这样工作:

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

没关系,通过这样做,它开始工作了:

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

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

没关系,通过这样做,它开始工作了:

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

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

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

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),然后再次定义指针指向的类型


这可能会导致灾难性的错误,尽管如果地址最初不指向实数,那么编译器可能会将随机内存解释为实数。

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

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),然后再次定义指针指向的类型


这可能会导致灾难性的错误,尽管如果地址最初没有指向实数,那么编译器可能会将随机内存解释为实数。

嗯。。。你为什么要这么做?大学作业的一部分,上一次我用帕斯卡做了些什么,那是很久以前的事了。。。你为什么要这么做?这是大学作业的一部分,而我上一次用帕斯卡做某事是很久以前的事了