20

ポインタによる呼び出しと参照による呼び出しの正確な違いを教えてください。実際、両方のケースで何が起こっているのでしょうか?

例えば:

参照による呼び出し:

void swap(int &x, int &y)
{
   int temp;
   temp = x; /* save the value at address x */
   x = y;    /* put y into x */
   y = temp; /* put x into y */

   return;
}

swap(a, b);

ポインターによる呼び出し:

void swap(int *x, int *y)
{
   int temp;
   temp = *x; /* save the value at address x */
   *x = *y; /* put y into x */
   *y = temp; /* put x into y */

   return;
}

  swap(&a, &b);
4

5 に答える 5

22

どちらの場合もまったく同じです。

ただし、小さな違いは、参照が null になることはありません(関数内では、有効な変数を参照していると確信しています)。一方、ポインターが空であるか、メモリ内の無効な場所を指している可能性があり、AV が発生します。

于 2013-07-02T10:32:12.937 に答える
4

意味的には、これらの呼び出しは同じ結果になります。内部参照はポインターで実装されます。

参照とポインターを使用する際の重要な違いは、参照を使用すると、自分をぶら下げるロープがはるかに少ないことです。参照は常に「何か」を指していますが、ポインターは何でも指すことができます。たとえば、このようなことをすることは完全に可能です

 void swap(int *x, int *y)
 {
    int temp;
    temp = *x; /* save the value at address x */
    ++x;
    *x = *y; /* put y into x */
    *y = temp; /* put x into y */

    return;
 }

そして今、このコードは何でもできるようになりました。クラッシュしたり、実行したり、サルをあなたの鼻から飛び出させたり、何でもできます。

疑わしい場合は、参照を優先してください。それらは、ポインターの抽象化のより高度で安全なレベルです。

于 2013-07-02T10:33:34.007 に答える
1

あなたの例では、違いはありません。

C++ では、参照はポインターを使用して実装されます。

編集:参照をNULLにすることはできないと信じている人のために:

int calc(int &arg)
{
    return arg;
}

int test(int *arg)
{
    return calc(*arg);
}

の結果はどうなるtest(0)でしょうか?

于 2013-07-02T10:31:52.533 に答える
0

ポインターがないため、なぜこれが javae とタグ付けされたのか正確にはわかりません。ただし、値属性で作業している場合、この概念では、ポインターと参照の両方を同じ意味で使用できます。たとえば、i=4 または *i=4 です。ポインターを使用する利点は、アドレス自体を操作できることです。場合によっては、アドレスを変更する必要があります (別のものを指すようにします...)。これは、参照用のポインターが異なる場合です。ポインターを使用すると、アドレスを直接操作できますが、参照はできません

于 2013-07-02T10:39:12.337 に答える
0

あなたのコードは C++ コードです。Java にはポインタがありません。どちらの例も同じことを行いますが、機能的に違いはありません。

于 2013-07-02T10:34:02.713 に答える