C言語関係掲示板

過去ログ

No709 ポインタの間接参照

[戻る] [ホームページ]
No.8522

ポインタの間接参照
投稿者---中学生(2003/07/20 20:39:14)


いつもお世話になっております。
ポインタの間接参照についてよく分からないので
コメントを付けてもらえないでしょうか?
#include <stdio.h>

int main()
{
int *po , var;
var = 100;
po = &var;

*po = 1010;
printf("変数varの値 = %d" , var);

return 0;
}


No.8525

Re:ポインタの間接参照
投稿者---物見遊山(2003/07/20 22:46:03)


>ポインタの間接参照についてよく分からないので

間接参照のどこが・何がわからないのか
記述しなければレスが付きにくいと思います。

まずは、どこが・何がわからないのか明確にしましょう。

#ソース自体に問題はなさそうです。

No.8526

Re:ポインタの間接参照
投稿者---中学生(2003/07/20 22:59:45)


po = &var;
*po = 1010;

レスありがとうございます。
↑の部分なのですが、*po = 1010;はvar = 1010;と
全く同じ役割をしているというのがなかなか理解できません。
何かに例えて説明していただけないでしょうか。
説明下手ですみません

No.8527

Re:ポインタの間接参照
投稿者---物見遊山(2003/07/20 23:37:20)


ちょっと補強したソースを書いてみました。
#include <stdio.h>

main(void)
{
    int v = 12345678;
    int *p = NULL;    // NULLはポインタを初期化するための定数って思ってて

    // これは大丈夫だよね?
    printf("v = %d\n", v);

    // &vがどんな値か見てみよう。
    printf("&v = %p\n", &v);

    // ついでにpの中にどんな値が入っているか見てみよう
    printf("p = %p\n", p);

    // &vの値をpに代入
    p = &v;

    // pの値は&vと等しいか確認してみよう
    puts("after \"p = &v\"");
    printf("p = %p\n", p);

    // *pの値を見てみよう
    printf("*p = %d\n", *p);

    return 0;
}

実行結果はこんな感じです。
$ ./pointer.exe
v = 12345678
&v = 0x22feec
p = 0x0
after "p = &v"
p = 0x22feec
*p = 12345678


変数(や関数)には識別子が付いています。
で。変数の前に'&'を記述すれば変数の識別子がわかるようになります。
上の実行結果の場合だと 0x22feec ってのが変数vの識別子になります。

ポインタ変数はその識別子を格納するためにある専用の変数です。
だから実行結果の p = 0x22feec のようにpにはvの識別子が入っています。

では、識別子で示される変数に格納されている値を参照するには
どのようにするかというと
(関数の処理定義部で)ポインタ変数の前に'*'をつければ
参照できるようになります。
上の実行結果では*pとvが等しいことから*pでvの値を
参照できていることがわかります。

あまり、上手く説明できていないと思うので
わからないことがあればレスをつけてみてください。
#物見より上手く説明してくれる諸兄が現れるかもしれませんし。

ちなみに、上記はメモリを意識しないように説明しました。念のため。
#以前規格の話が出てたので。

No.8536

Re:ポインタの間接参照
投稿者---ともじ(2003/07/21 17:09:10)


こんにちは。

>*po = 1010;はvar = 1010;と
>全く同じ役割をしているというのがなかなか理解できません。
>何かに例えて説明していただけないでしょうか。

以前ここに書き込んでくれた人で、ポインタとはテレビのリモコンのような
ものだと書いていた人がいました。そのとき、上手いことを言うな、と思い
ました。

テレビのチャンネルを替えるには、直接テレビに付いているチャンネルを
替える方法とリモコンのボタンを押す方法がありますよね。変数や配列に
直接アクセスするのは、直接チャンネルを回すようなものです。ポインタ
でアクセスするのはリモコンを使うようなものです。つまり、直接ではなく
間接的に変数や配列をアクセスします。

テレビのリモコンは買ってきたときには既に対応するチャンネルが記憶
されていて、何も設定することなしに使うことができますが、ポインタは
どのアドレスを指すのかを設定する必要があります。
(リモコンでもビデオでは、Gコードを使うためにその地方のテレビ局の
番号に合わせて設定が必要ですね。)

そういう風に考えて、提示のプログラムを見ると、こんな感じでしょうか。
    int *po , var;    /* テレビとリモコンを買ってくる */
    po = &var;        /* リモコンにテレビの局番を設定する */
    *po = 1010;       /* リモコンを使って局番にアクセスする */

普通にコメントを付けると、以下になります。
    int *po , var;    /* 変数とポインタの宣言 */
    po = &var;        /* ポインタに変数のアドレスを設定 */
    *po = 1010;       /* ポインタの指すアドレスに値を代入 */



No.8541

Re:ポインタの間接参照
投稿者---nop(2003/07/21 19:32:56)


こんな感じでいかがですか?

int main()
{
    int *po , var;    /* int 型の領域を指す値を格納するための変数 po と、 */
                      /* 整数値を格納するための変数 var を宣言する         */

    var = 100;        /* 変数 var に整数値 100 を格納する              */
    po = &var;        /* 変数 po に変数 var をポイントする値を格納する  */

    *po = 1010;       /* 変数 po でポイントされる領域に 1010 を格納する */
    printf( "変数varの値 = %d", var );

    return 0;
}