変数の参照はアドレスを使わないとできないと言いました。では、「参照」はどのようにして変数を参照しているのでしょうか?
ということで、今回は参照のしくみについて話していきたいと思います。
では、今回の要点です。
では、いってみましょう。
変数の参照はアドレスを使わなければ不可能です。すると、当然「参照」もアドレスを使っているに違いありません。
しかし、そうなると「参照」とポインタによる参照との違いはどうなるのでしょうか?
実は、文法的な違いのみです。& や * を付けなくていい、そのかわり「参照」自身に対する操作はできない、ただそれだけです。
「参照」という変数ができて、それにアドレスを入れ初期化する。すると「参照」はそのアドレスにある変数の代用品になる。こういうしくみなのです。ポインタと変わりないですね。
つまり、何が言いたかったかといえば、「参照も変数だよ。ポインタと同じようなものだよ」ということです。
では、本当に参照という変数ができているのか確かめてみましょう。その方法としては、参照に入っているアドレスと、参照自身のアドレスを見ることが一番です。
「あれ? さっき『参照』自身に対する操作はできないと言ったばかりじゃないか」と言いたいでしょうが、それはC++言語での話です。詳しい話は抜きにしますが、インラインアセンブラを使えば参照のアドレスを表示することができます。インラインアセンブラを使えば、参照自身を操作することができるのです。
| プログラム | 実行結果例 | 
|---|---|
| // Ref2.cpp
#include <stdio.h>
char format[]= "&a = %d\n r = %d\n&r = %d\n";
int main()
{
    int  a;
    int& r = a;
    // a のアドレスと、r の値と、r のアドレスを表示します
    __asm
    {
        push    0
        lea     eax, r
        push    eax
        push    r
        lea     eax, a
        push    eax
        lea     eax, format
        push    eax
        call    printf
        add     esp, 20
    }
    return 0;
} | &a = 6618612 r = 6618612 &r = 6618608 | 
細かいことは抜きにしますが、これは、a のアドレスと、r に入ってるアドレスと、r 自身のアドレスを表示するプログラムです。
実際に r には a のアドレスが入っていて、r 自身にも別のアドレスが存在することが確認できました。
あ、こんなことは真似するもんじゃありませんよ(笑)。説明のためにやむなくしているだけですから。
今回はこれ以上することもないので、これで終わります。
では、今回の要点です。
では、また次回まで。さようなら。
Last update was done on 1999.4.15
この講座の著作権はロベールが保有しています