2

重複の可能性:
C ++:参照とポインターをいつ使用するか

私はC/C ++言語のかなり新しいプログラマーであり、C#、Java、JavaScript、およびVisual BasicとPythonのバックグラウンドを持っているため、C++のいくつかのことを理解するのに苦労しています。 。

参照とポインタの使い方や実際の意味などはすでに知っていますが、なぜどこで使うのかわかりません。私は参照が時々このように使われることを知っています:

int x = 2;

void Square(int &value)
{
   value = value*value;
}

Square(x);

cout << x << endl;

そして、出力は4になります。

私はなぜそれをそのように行うのか、そしてこのようにしないのかを完全には理解していないと思いました:

int x = 2;

int Square(int value)
{
   value = value*value;
   return value;
}

x = Square(x);

cout << x << endl;

とにかく、誰かが参照とポインタを使用する理由と場所を理解するのを手伝ってくれることを願っています。

4

7 に答える 7

3

2つの主な理由で参照を渡します。

  • 関数内で参照されるオブジェクトの値を変更するには
  • 渡すオブジェクトをコピーするコストを回避するため

最初のメリットではなく2番目のメリットが必要な場合は、const渡されたオブジェクトを誤って変更しないように、通常は参照を渡します。

C ++では、ポインターと参照は2つの例外を除いてほとんど同じです。

  • nullptr参照が0(または)を指すことはできません
  • 参照は常に同じオブジェクトを指している必要があります

これらのいずれかを実行する場合は、ポインターを使用する必要があります。

さらに、ポインタは通常、を使用してヒープ内に作成されたオブジェクトを指しますが、new参照は通常、スタック内に作成されたオブジェクトを指します。これは、ポインタが指すオブジェクトの存続期間は通常、手動で制御されることを意味します。deleteオブジェクトを破棄するには、によって作成されたオブジェクトを明示的に呼び出す必要newがありますが、スタックに作成されたオブジェクトの存続期間は、ランタイムによって自動的に管理されます(そのため、オブジェクトの名前は「自動変数」です)。

これがあなたが知る必要があるすべてであるかどうか、またはあなたがより具体的な何かを探しているかどうかはわかりません。

于 2012-04-09T08:24:37.220 に答える
1

そのような例には実際的な違いはありませんが、整数をに渡す代わりに、Square()正方形が10ギガバイトのデータを必要とする複雑なアルゴリズムであると想像してください。パラメータがコピーされないように、ポインタを使用したほうがいいのではないでしょうか。

于 2012-04-09T08:25:54.767 に答える
0

2番目の例では、変数をローカルにコピーしますx(関数内でのみ表示されSquareます)。

グローバルが変更されないようにしたい場合は、xそのようにしてください。ただし、それは高価かもしれません(変数がより大きなオブジェクト/構造体である場合)...そして冗長です-キーワードをチェックしてくださいconst

于 2012-04-09T08:20:50.187 に答える
0

引数を参照として渡すということは、そのコピーである変数ではなく、その値を変更することを意味します(何らかの操作を行う場合)。&valueを使用するため、&valueが指すアドレスに格納されている内容が変更されます。

また、Squre()でxの代わりに&xを渡す必要があります。

したがって、x = Squre(&x);

また

Squre(&x);

と同じ。

于 2012-04-09T08:23:36.460 に答える
0

参照は、変数の単なる疑似名です。参照に適用されたアクションは、実際に参照する変数に影響を与えます

int a = 5;
int &b = a;
b++; // 'a' gets equal to 6

あなたの例では、乗算の結果を返しますが、何も返さない関数に渡される変数の値を変更する必要がある場合はどうなりますか?

これは、参照が便利になるときです。ポインタが変数の疑似名ではなく、そのアドレスであることを除いて、ポインタは同じように動作します。変数へのポインターを関数に渡し、それを逆参照することができ、それはまったく同じように変数に影響を与えます。

于 2012-04-09T08:24:53.783 に答える
0

さて、POD=構造の場合、操作が理解しやすいため、多くのメリットは見られません。

ですから、あなたx = square(x)はそれが言うことをほとんど実行し、かなり良いパフォーマンスを発揮します。

ポインタ/参照を使用する利点は、オブジェクトをメソッドに渡すときに発生します。この場合:

Object x;

Object squre( Object x )
{
    x._internalvalue = x._internalvalue * x._internalvalue;
    return x;
}

x = squre(x);

ここで行われるプロセスはまったく異なります。=記号 自動的にオブジェクトに適用されないため、割り当て演算子を見つける3つのルールと呼ばれるものを実装する必要があります。ただし、代入演算子は、メモリ内に新しい(一時的な)オブジェクトを再作成し、代入演算子を呼び出してから、このオブジェクトのメモリを元のにコピーして戻す必要があるため、非常にコストがかかりますx

また、関数の引数としてオブジェクトを渡すと、プロセッサはこのオブジェクトが使用するメモリ全体をスタックにコピーし、関数内でそのオブジェクトにアクセスできるようになります。これは非常にコストがかかります。

したがって、質問に答えるために、単純な古い整数よりもはるかに大きい構造体とオブジェクトを操作し始めるときに、参照とポインターを使用することの利点がわかり始めます。

参照を使用してプログラミングすると、パフォーマンスが向上し、大きなオブジェクトを操作する際のスタックオーバーフローのリスクが制限されます。

于 2012-04-09T08:26:53.963 に答える
0

参照は、別の名前を使用して変数を参照する場合に使用されます。それらはまったく同じタイプ、値などを持っています。
ポインタは多少異なり、アドレスを格納するための新しいタイプです。

int i;  
Int &ref = i;  
Int *pointer = &i;  

その場合、refと* pointerは実際には同じものであり、iの値です。
ただし、文字通りの「ref」は単なる「i」(初期化後に変更することはできません)ですが、「pointer」は一時的にiを指していることを知っておく必要があります。
したがって、ほとんどの場合、それらは同じものです。
では、いつ参照またはポインタを使用しますか?
私の意見では、どちらが便利かを使用してください。
たとえば、参照を変更することはできませんが、ポインタは別のものを指します。^ _ ^
ああ、コピーのコストを忘れています。相手の答えを確認してください。

于 2012-04-09T08:28:36.943 に答える