ま、これはポインタのごく簡単な使い方を示した サンプルプログラムです。ここで、pはint型への ポインタです。*pとaは同じものを表しています。 つまり、aという記憶領域に*pという「別名」が ついたと考えられます。これを*pはaのエイリアス(alias) といいます。aliasとは「別名」とか「あだ名」という意味の 英語です。そういえばMacで、デスクトップに置くアイコンも 確か「エイリアス」と呼んでいたと思います。プログラムの本体が デスクトップにあるわけではなく、本体を呼び出すためのあだ名 という意味でしょうか?Windows95でいえば、ショートカットですね。//Cのプログラム alias.c #include <stdio.h> int main(void) { int *p, a = 10; p = &a; printf("*p = %d\n", *p); return 0; }
まず、普通にint型変数aを宣言します。 次にaのエイリアスaliasを宣言し、同時に初期化します。 同時に初期化するというのがミソです。
というようにはできません。 このままコンパイルすると「参照が初期化されずに宣言されています。」 というエラーが出ます。参照とは、「&」演算子を付けて表します。 そして、宣言と同時に初期化されるとあとは参照される変数と 全く同じに扱えます。ところで、この演算子はポインタのところでやった 「アドレス演算子」と同じですね。どうやって区別したらよいのでしょうか。int a; int &alias; &alias = a;
参照の場合は、「&」の前に、データ型の名前が来る
さて、C言語編で次のようなプログラム を紹介しました。
main関数で、変数x,yのデータを入れ替える change_data関数を呼び出しています。 この時呼ばれる側の関数では、呼び出し側の変数の アドレスをもらっています。Cでは、このようにしないと 呼び出し側の変数は変更できませんでした。 では、先ほどやった「参照」を使って書き換えてみましょう。//どんな本にでも載っているCプログラム #include <stdio.h> void change_data(int *, int *); int main(void) { int x = 10, y = 5; printf("x=%d, y=%d\n", x, y); printf("データを交換します。\n"); change_data(&x, &y); printf("x=%d, y=%d\n", x, y); return 0; } void change_data(int *a, int *b) { int c; c = *a; *a = *b; *b = c; return; }
change_data関数では、引数に「参照」を使っています。
こうすることにより、元の変数を変更することができます。
はい、このとおり!
Update Jan/05/1997 By Y.Kumei