C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の参照(リファレンス)とは?ポインタとの違いと使い方を徹底解説

参照(リファレンス)変数とは、ある変数につけられた「別名(エイリアス)」のことです。すでに存在する変数に対して別の名前を与えるものであり、一度変数で参照を初期化すれば、元の変数名でも参照名でも、同じ変数を扱うことができます。

参照とポインタの違い

参照はよくポインタと混同されますが、両者には以下の3つの大きな違いがあります。

  • NULL参照は存在しない:参照は必ず有効なメモリ領域に接続されているものとして扱えます。一方、ポインタはNULLになり得ます。

  • 参照先を後から変更できない:参照はオブジェクトに対して一度初期化されると、別のオブジェクトを指すように変更することはできません。ポインタなら、いつでも別のオブジェクトを指し直せます。

  • 作成時に必ず初期化が必要:参照は宣言された時点で初期化しなければなりません。ポインタは任意のタイミングで初期化できます。

C++での参照の作り方

変数名を「メモリ上のその変数が置かれている場所に貼られたラベル」と考えてみてください。すると、参照は「その同じメモリ上の場所に貼られた2枚目のラベル」と捉えることができます。つまり、元の変数名経由でも、参照経由でも、同じ変数の中身にアクセスできるわけです。

例えば、次のようなコードがあったとします。

int i = 17;

この変数 i に対する参照変数は、次のように宣言できます。

int& r = i;

この宣言に含まれる & は「参照」を読み替えてください。つまり「ri で初期化された整数型の参照である」という意味になります。同様に double& s = d; であれば、「sd で初期化されたdouble型の参照である」と読めます。

サンプルコード

実際に参照を使ったプログラムを見てみましょう。

#include <iostream>
using namespace std;

int main () {
    // 通常の変数を宣言
    int i;
    double d;

    // 参照変数を宣言
    int& r = i;
    double& s = d;

    i = 5;
    cout << "Value of i : " << i << endl;
    cout << "Value of i reference : " << r << endl;

    d = 11.7;
    cout << "Value of d : " << d << endl;
    cout << "Value of d reference : " << s << endl;

    return 0;
}

実行結果

このプログラムをコンパイルして実行すると、次のような出力が得られます。

Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7

このように、元の変数 id の値と、それぞれの参照 rs を介して取得した値は完全に一致します。参照はあくまで同じメモリ領域への別名なので、どちらの名前を使っても同じデータを操作できることが確認できます。

  1. PHPのリファレンス(参照)とは?基本から実例までわかりやすく解説

    はじめに:PHPのリファレンスとはPHPにおけるリファレンス(参照)とは、同じ変数の内容に異なる名前でアクセスできるようにする仕組みです。C/C++のポインタとは性質が異なり、リファレンスに対して算術演算を行うことはできません。C/C++のポインタが実際のメモリアドレスを指すのに対し、PHPのリファレンスはシンボルテーブル上のエイリアス(別名)にすぎません。PHPでは変数名と変数の内容は別個のものとして扱われるため、同じ内容に対して複数の名前を付けることが可能です。リファレンス変数を作成するには、元の変数に&記号を付けます。たとえば$b=&$aと書くと、「$bは$aのリファレン

  2. Pythonで変数への参照(リファレンス)は作成できる?C/C++との違いを徹底解説

    はじめに:PythonとC/C++では「変数」の意味が違う Pythonにおける変数の概念は、CやC++とは根本的に異なります。C/C++では、変数とはメモリ上の特定の場所(アドレス)に付けられた名前のことです。そのため、ある変数の値を別の変数に代入しても、値が別のメモリ領域へコピーされるだけで、両者は互いに独立した存在となります。 int x = 5; int y = x; 例えばC++では、& 演算子を使うことで、宣言された変数のメモリアドレスを取得できます。 cout << x << &x << y << &y; こ