比其他(非常好)的答案更简单。
它是否与C中的工作方式类似,并且过程获取指向变量的指针并使用此指针。
是的,这就是幕后发生的事情。该过程实际上是变量的指针,地址。但是,编译器知道这一点,使其透明化。因此,在声明参数“a”的过程中,语句:
a := a div 2;
可以用两种不同的方式编译。如果 a 参数是正常声明的,即通过值传递,语句编译如下:
a
1 - 在地址“a”加载值 2 - 整数除以2 3 - 将结果存储在地址“a”
相反,如果参数声明为 var ,意思是通过引用传递,编译器做:
var
1 - 在地址“a”加载值 2 - 加载刚刚加载的地址的值(它是一个指针解除引用) 3 - 分裂 4 - 回来
如果源是:C,上面的四个语句正是C编译的:
*a = *a / 2;
我想我可以将我的问题表述为:Pascal是否支持真正通过引用传递......?
答案绝对是肯定的,通过引用真实地传递,而且没有多少语言能够如此干净利落地完成这一任务。调用过程的源代码不会更改,无论是使用“by reference”还是“by value”调用过程。再次,编译器知道如何传递形式参数,隐藏细节,不像C. 例如,调用一个希望通过值传递参数的过程:
myproc(a); // pascal and C are identical
如果程序期望通过引用传递,则情况会有所不同:
myproc(a); // pascal: identical to before myproc(&a); // C: the language does not hide anything
关于最后一点,有人认为C是最好的,因为它迫使程序员知道传递的变量可以被过程(函数)修改。相反,我认为pascal更优雅,程序员应该知道程序将会做什么。
所有这些都是针对“简单”类型的。如果我们谈论字符串(而现代pascal有两种风格),它就是相同的 - 在Pascal中。编译器复制,增加引用计数,执行完全支持传递值或引用所需的任何内容。 C语言没有类似的东西。
如果我们谈论课程,那么事情就会有所不同,但它 必须 不管怎样,由于类的语义而有所不同。
我希望在其他完整答案中添加一些内容。