2017-07-18 71 views
0

傳遞引用很容易使用大多數使用指針的語言進行可視化。但在Pascal中,我幾乎看不到指針如何繞過子程序作爲參數傳遞。傳遞參考如何工作?

例如:

var a: array [0..2] of integer; 
    i : integer; 

    procedure swap(var x, y: integer); 
    var temp: integer; 
    begin 
     temp := x; 
     x := y; 
     y := temp; 
    end; 

begin 
    i := 0; 
    a[i] := 2; 
    swap(i, a[i]); 
end. 

能否swap(i, a[i]);程序調用語句與此相當的僞代碼被取代?口譯員是如何在幕後工作的?

var tmpOldArrayExpression, tmpNewFirst, tmpNewSecond : integer; 
tmpOldArrayExpression := i; 
(tmpNewFst, tmpNewSnd) := swap(i, a[i]); 
i := tmpNewFirst; { 2 } 
a[tmpOldArrayEession] := tmpNewSecond; { 0 } 

回答

1

在幕後,功能Swap實現爲:

function Swap(x, y: ^integer); // or: PInteger 
var 
    temp: integer; 
begin 
    temp := x^; 
    x^ := y^; 
    y^ := temp; 
end; 

它是在現實中(而不是語法)呼籲,如:

i := 0; 
a[i] := 2; 
swap(@i, @a[i]); 

和Pascal是一個編譯語言。它(一般)不解釋。


想了解更多關於這一點,讀my article explaining pointers and references, especially about reference parameters。這是關於德爾福的,但同樣的原則適用於大多數帕斯卡。

+0

你有幫助的鏈接答案的別名規則我的大部分帕斯卡問題。你能再給我一個更多的問題嗎?對於不能即時編譯爲機器碼(JIT)的interperter,它們是否與我的僞代碼類似? – MiP

+0

如果您有其他問題,請詢問另一個問題。關於解釋器(和/或編譯器)是如何工作的,已經有整本書(有許多頁)。我不知道你的意思是「類似於我的僞代碼」。 –

+0

這是這個話題的最初問題,我不認爲我應該重新制作一個新的。 「C#」是什麼意思? – MiP

0

AFAIK帕斯卡爾在這方面比C更簡單,因爲雖然是它具有獨立的語法,但目前還沒有有關參數是對方(這IIRCç確實有)