この記事には複数の問題があります。改善
やノートページでの議論にご協力ください。参照(さんしょう、英: reference、リファレンス)は、他の場所にあるデータを指している情報を含む小さなオブジェクトであり、それ自身の中に(指している)データ自体を含まない。参照の指す値を取り出すことをデリファレンス (dereference) と呼ぶ(間接参照も参照)。参照は様々なデータ構造を構成する基本要素であり、プログラム内の各部で情報をやり取りするための基本でもある。
なお、C++には、参照型というものがあるが、以下で説明するのはC++のそれではなく、一般概念である。C++の参照については、ポインタ (プログラミング)#参照を参照のこと。 参照は家の住所に似ている。住所は非常に小さな識別子であり、それが指しているモノにはさらに豊富な情報があるだろう。例えば、その家を見れば色がわかるが、住所だけでは色はわからない。住所は単に家を見つけることを可能にするだけである。しかし、もし家の色が知りたければ、住所さえあれば見つけ出して実際にその家を見ればよい。つまり、住所は家の色を知るための充分な情報源となる。住所から家を探すことは、参照をデリファレンスすることに似ている。 もっと複雑な例として、引越しの度に新しい家の住所を古い家に残しておくとする。誰かが最初の家を訪ねると、置いてある住所から次の家へ次の家へとたどっていき最終的に現在の家にたどり着くことができる。これは参照を使用した単純な線形リストに似ている。 住所の別の利点は、それが実際の家よりもずっと扱いやすいことである。例えば、町内の人々を姓の五十音順に並べたいとしよう。ひとつの方法として、巨大なクレーンを使って町内の家を全部物理的に並べ替える方法がある。もっと簡単な方法としては、町内の人たちの住所のリストを作り、姓の五十音順にそれを並べ替えるという方法がある。参照にも同様の利点がある。データへの参照を操作することによってデータ自体を変更することなく様々なことができるし、場合によってはその方が効率的である。 日常生活は参照の例であふれている。電話番号、電子メールアドレス、URLなどなど。いずれも遠隔にあるリソースを指し、それらへのアクセスを可能とする。 参照によって、オブジェクトを格納する場所、格納方法、コード内での引き渡しなどの柔軟性が増す。参照によって実際のデータにアクセスできるなら、データ自体を移動させる必要はない。また、複数のコードが参照によってひとつのデータを共有することもできる。 ポインタはオブジェクトのメモリ上のアドレスだけを格納したものである。これは最も基本的で間違えやすい参照だが、最も強力で効率的な参照でもある。スマートポインタは不透明データ構造 ファイルハンドルはファイルの内容を抽象化する参照である。それはファイルへのロックを要求する際にはファイル自体を指すと同時に、ファイルを読む際にはファイル内の特定の位置を指す。 より一般化すると、参照は、あるデータの一意の検索を可能とする別のデータとみなすことができる。これにはデータベースの主キーや連想配列のキーなども含まれる。データの集合 D について、D から D ∪ {null} への一意に定まる関数が参照の定義となる。ここで null は意味のあるものを指していないデータである。 このような関数の別の表現として、「到達可能性グラフ; reachability graph」と呼ばれる有向グラフがある。ここで、各データは頂点として表され、データ u から データv へのエッジがあるとき、u は v を参照している(グラフ理論)。最大出次数は 1 である。このように参照をグラフとして捉えることはガベージコレクションで到達不可能なオブジェクトからのアクセスを分離するのに有効である。 この節は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
住所を使ったたとえ話
参照の利点
形式表現
外部収納と内部収納
出典検索?: "参照" 計算機科学
多くのデータ構造の中で、大きく複雑なオブジェクトは小さなオブジェクト群から構成されている。そのようなオブジェクト群の格納方法は以下のように2つに分けられる。
@media screen{.mw-parser-output .fix-domain{border-bottom:dashed 1px}}内部収納(internal storage)[要出典]では、小さなオブジェクトの内容は大きなオブジェクトの内部に格納されている。
外部収納(external storage)[要出典]では、小さなオブジェクトは独自の場所に置かれ、大きなオブジェクトはそれへの参照のみを格納する。