在(Free)Pascal中,函数是否可以返回可以在不取消引用的情况下进行修改的值?

时间:2019-07-09 23:57:38

标签: pointers pascal freepascal

在Pascal中,我了解可以创建一个函数,该函数返回可以被取消引用的指针,然后为其分配一个值,例如以下(令人讨厌的无用)示例:

type ptr = ^integer;
var d: integer;

function f(x: integer): ptr;
    begin
        f := @x;
    end;

begin
    f(d)^ := 4;
end.

现在d是4。

(实际用法是访问相当复杂的记录数据结构数组的一部分。我知道一个类比嵌套记录的数组要好,但这不是我的代码(它是TeX:The Program)并且是在Pascal实现支持对象导向之前编写的。该代码实质上是使用Pascal之上的语言编写的,该语言添加了宏,这些宏在编译器看到它们之前就已扩展。因此,您可以定义一些带有参数的宏m x并扩展为thearray[x + 1].f1.f2而不是每次都写;用法为m(x) := somevalue。我想用一个函数而不是宏来复制此功能。)

但是,如果没有^运算符,是否可以实现此功能?是否可以编写函数f使得f(x) := y(无尖号)将值y分配给x?我知道这很愚蠢,答案可能是否定的,但我只是(a)不太喜欢它的外观,并且(b)试图精确模仿我上面提到的宏的形式。

1 个答案:

答案 0 :(得分:1)

与C ++或D等语言不同,引用不是Pascal中的一流对象。因此,简单的答案就是您无法直接实现所需的目标。

使用您所说明的指针是获得相同效果的一种方法,尽管在实际代码中,您需要返回寿命超出该函数寿命的对象的地址。在您的代码中情况并非如此,因为参数x仅在函数返回之前才有效。

您可以使用带有操作符重载的增强记录来封装指针,从而封装指针解引用代码。这可能是一个不错的选择,但它在很大程度上取决于您的总体问题,而我们没有看到这一问题。