1

最初の関数呼び出しでは、マトリックス パス バイ リファレンスを送信しています。2番目の方法は同じではありませんか?マトリックスはデフォルトの参照渡しだと思いました。

最初のケースは次のとおりです。

phi= new double[15]; //phi is a dynamically allocated array

function(double *phi) //calls phi with what SHOULD be default pass by reference

2 番目のケース:

function(double *&phi) //calls phi with pass by reference?

両者に違いはないはずですよね?

私が尋ねる理由は、「&」記号を無視して、動的に割り当てた関数の外で phi に値を割り当てようとすると、コード セグメントが失敗するためです。

4

2 に答える 2

8

最初のケースでは、関数宣言は値によってポインターを受け入れます。

2 番目のケースでは、関数宣言は参照によってポインターを受け入れます。関数内のポインターを変更できます。

于 2013-05-17T22:10:30.510 に答える
1

「参照として渡す」の意味を誤解しているようです。変数を参照として渡すと、変数の値を変更する機能が関数に与えられます。

次のように定義された関数があるとします。

doIt(int i)

そして私はそれを次のように呼びます:

main()
{
    int a = 2;

    doIt(a);
}

この関数は、「a」変数の値を変更できません。

あなたの場合、ポインタを使用しています。次の機能があるとします。

doItWithAPointer(int* a)

そしてそれを次のように呼び出しました:

main()
{
    int a = 2;
    int* pa = &a;

    doItWithAPointer(pa);
}

「a」の値を変更できるようになりました。なんで?ポインターを介してその値にアクセスできるためです。私ができないことは、実際のパラメーターの値を変更することです。この場合は「pa」です。つまり、別のアドレスを指すようにします。

さて、最後に、次のように関数を宣言すると:

doItWithAPointerReference(int* &a)

そしてそれを次のように呼び出しました:

main()
{
    int a = 2;
    int* pa = &a;

    doItWithAPointerReference(pa);
}

「a」変数の値はポインターを介して変更できますが、「pa」への参照があるため、「pa」の値を直接変更することもできます。

于 2013-05-17T22:24:33.757 に答える