2017-07-18 14 views
0

参照渡しは、主にポインタを使用する言語で視覚化が容易です。しかし、パスカルでは、ポインタがどのようにサブルーチンを引数として渡すのかほとんど見ることができません。例えば参照渡しはどのように機能しますか?

は:

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がありますa コンパイル言語。それは(一般的に)解釈されない。


この詳細情報は、my article explaining pointers and references, especially about reference parametersをお読みください。それはDelphiについてですが、同じ原則がほとんどのPascalsに適用されます。

+0

があなたの役に立つリンク答えはありません私のパスカルの問題のほとんど。もう一度質問してください。オンザフライ(JIT)でマシンコードをコンパイルしないインターペアでは、私の擬似コードと同じようにシーンの背後で動作しますか? – MiP

+0

別の質問がある場合は、別の質問をしてください。インタプリタ(および/またはコンパイラ)がどのように動作するかについて書かれた書籍(多くのページが多数あります)があります。私はあなたが「私の擬似コードに似ています」とは何を意味するのか分かりません。 –

+0

このトピックの最初の質問ですが、新しい複製を作成する必要はありません。 "C#"とはどういう意味ですか? – MiP

0

はい、それは別の構文を有しているので、私の知る限りパスカルは、この点でCよりもさらに簡単ですが、(IIRC Cが持っていない)のパラメータはお互いの別名であることについてはルール

関連する問題