web-dev-qa-db-ja.com

ポインタと参照の間に違いはありますか?

参照とポインタは、私が知っているのと同じことを行います。それらの間に違いはありますか?

違いがない場合、なぜポインタではなく参照と呼ぶのですか?

8
yfklon

大きく分けて、次のような違いがあります。

referenceは、別の何かを参照する変数であり、その別の何かのエイリアスとして使用できます。

pointerは、メモリアドレスを格納する変数であり、そのアドレスに格納されているもののエイリアスとして機能します。

したがって、ポインターは参照ですが、参照は必ずしもポインターではありません。

ポインタは、参照の概念の特定の実装であり、この用語は、メモリアドレスに直接アクセスできる言語にのみ使用される傾向があります。

参照は、ポインターを使用するか、他のメカニズムを使用して、言語で内部的に実装できます。たとえば、Perlにはシンボリック参照があり、メモリの場所ではなく名前で変数を参照します。これが、このような奇妙なコードが機能する理由です。

my $bar = "foo";
$$bar = "Am I foo or bar?"; #This is actually a reference to $foo!
print $foo;

参照とポインタのこの区別は厳密な規則ではありません(参照とポインタの両方があり、それぞれに異なる意味があるため、C++が主な例外です)が、ほとんどの使用法をカバーしています。

19
user82096

用語を使用して言語の十分に広い分布を見る場合、ポインタと参照の間に一般に受け入れられている違いはありません。同じ概念の変形では、両方の用語(および他のアクセスのようないくつかの用語)をほぼ無関心に使用しますが、一部の特性は用語の1つと密接に関連する傾向があります。

  • 算術が利用できる場合、参照という用語が使用されるのを見たことはありません。 (ただし、ポインタは算術が利用可能であることを意味しません)

  • 参照先のオブジェクトを変更できない場合、ポインターやその他の要素に適用できる定数プロパティがある場合を除いて、ポインターという用語を使用したことはありません。 (ただし、参照は再バインド不可を意味するものではありません)。

6
AProgrammer

ポインターと参照は、オブジェクトを使用するためのプレースホルダーです。

オブジェクト自体を使用する代わりに、ポインタまたは参照を使用して、オブジェクトにアクセスしたり、オブジェクトを操作したりできます。

Car myCar = new Car();
Car& myCarReference = myCar;

MyCarReferenceのコンテンツを変更すると、myCarのコンテンツが変更されます。

ポインタは、強力であるが潜在的に危険なアドレス操作を参照に追加します。例:

Car* myCarPointer;

    // 0x12345678=the memory adress where one car 
    // object is supposed to be in memory.
myCarPointer = 0x12345678;  
myCarPointer->setColor(red);

myCarPointer+=20;  // advance 20 cars in an array

潜在的に危険なことは、「ポインターに任意のアドレスを割り当てることができることを意味します。ポインターは、車のオブジェクトがない場所を指すことができます。

Javaおよびc#のような言語は、ポインタのみを持つc/c ++に比べてプログラムをより堅牢にするために参照を導入しました

4
k3b

あなたは間違ったものを並置しています。 C++では、ポインターと参照の意味は異なりますが、C++について質問しているわけではないので、それが目的ではないのではないかと思います。もしそうなら、ハーシュの答えをチェックしてください。

おそらく知りたいのは、オブジェクトへの参照とオブジェクト自体の違いです。ほとんどの新しい言語では、値または参照によってオブジェクトを渡すことができます。

オブジェクトを値で渡すとは、オブジェクトのコピーを作成することです。オリジナルに影響を与えることなく、そのコピーを変更できます。ただし、そのコピーを作成すると、大量のメモリアクセスが発生する可能性があります。

オブジェクトを参照渡しすることは、そのオブジェクトにハンドルを渡すことを意味します。コピーを作成する必要がないため、これは安価です。また、行った変更は元のファイルにも影響します。

関数型プログラミング言語は、副作用を回避するため、すべてを値で渡す傾向があります。

2
Steve Rowe

ポインタと参照は十分に異なって見えますが(ポインタは*および->演算子を使用し、参照は。を使用します)、それらは同様のことをしているようです。ポインタと参照の両方で、他のオブジェクトを間接的に参照できます。では、どのようにして一方を使用し、もう一方を使用しないかをどのように決定しますか?まず、null参照などがないことを認識してください。参照は常に何らかのオブジェクトを参照する必要があります。その結果、別のオブジェクトを参照することを目的とする変数があるが、参照するオブジェクトがない可能性がある場合は、変数をポインターにする必要があります。これは、変数をnullに設定できるためです。一方、変数が常にオブジェクトを参照する必要がある場合、つまり、変数がnullである可能性を考慮して設計されていない場合は、変数を参照にする必要があります。

詳細は http://www.cplusplus.com/articles/ENywvCM9/ を参照してください

1
Harssh