参照と言えば、まず一つの話をしましょう。私たちの住んでいる庭には、こういう小さな友達がいました。彼の名前は羅XXといいます。私たちは彼にあだ名をつけるのが好きです。彼を見ると栄養状態があまり良くなさそうで、頭が大きく体が小さいので、「大根頭」というあだ名をつけました。つまり、羅XXが彼の本名で、大根頭が彼の別名です。では、参照とは何でしょうか??
定義:参照:変数の別名です。

注:別名として、変数は別名だけを持ち、自分の本名を持たないということはできません。
基本データ型の参照
次のコードのようです:
例
#include <iostream>
using namespace std;
{
int a = 3;
int &b = a; //bはaの参照、つまりbはaの別名です。
//参照は初期化が必須です。そうしないとコンパイルエラーになります。
b = 10;
cout<< a << endl; //このとき、aの値は元の3から10に変わっています。なぜなら、別名に対してどのような操作を行っても、実際には変数そのものに対する操作になるからです。まるで、私たちが大根頭に何かをするよう頼むと、羅XX自身がそれをするのと同じです。
return 0;
}
構造体型の参照
次のコードのようです:
例
#include <iostream>
using namespace std;
//Coorという名前の構造体を定義します。これは座標です。
typedef struct
{
int x;
int y;
}Coor;
int main(void)
{
Coor c1; //c1という構造体変数を定義します。
Coor &c = c1; //c1にcという別名をつけます。
c.x = 10; //参照を通じて構造体変数のデータメンバーに値を代入します。
c.y = 20;
cout<< c1.x << c2.y; //出力結果:10 20
return 0;
}
ポインタ型の参照
ポインタ型の参照は、参照の中でも最も複雑で理解しにくい部分であり、同時に記述形式にも独特な点があります。
定義:
型 *&ポインタ参照名 = ポインタ;
例を見てみましょう:
例
#include <iostream>
using namespace std;
int main(void)
{
int a = 10; //int型の変数aを定義します。aの値は10です。
int *p = &a; //変数aを指すポインタを定義します。
int *&q = p; //ポインタの参照を定義します。つまりqはpの別名です。定義方法:型 *&ポインタ参照名 = ポインタ;
*q = 20; //20を*qに代入することは、20を*pに代入することに相当し、つまり20をaに代入することに相当します。
cout<< a << endl; //aの値として20が出力されます。
return 0;
}
関数の引数としての参照
参照を学ぶ前に、C言語を学んだときに、次のような古典的なプログラムを学びました。
//2つの値を交換します。
void fun( int *a,int *b) //仮引数は2つのint型ポインタ変数です。
{
int temp = 0; //一時変数を定義します。良い習慣として、変数を定義したら初期化します;
c = *a; //*aをcに代入します;
*a = *b; //*bを*aに代入します;
*b = c; //そしてcを*bに代入します;これでa、bの値の交換が完了します。
}
int x = 10,y = 20;
fun(&x,&y); //メイン関数で呼び出すとき、渡す実引数は &a, &b と書く必要があり、面倒で理解しにくいです。
では、参照を学んだ今、同じ機能を実現するにはどのように書けばよいでしょうか?
例
void fun (int &a, int &b) //仮引数は2つのint型参照です。
{
int temp = 0;
temp = a;
a = b;
b = temp;
}
int x = 10,y = 20;
fun(x,y); //メイン関数で呼び出すとき、実引数を渡すと、aはxの別名、bはyの別名になります。
原文アドレス:https://blog.csdn.net/stop_and_go/article/details/51334137