28章 ポポ、ポインタ

http://www.geocities.jp/ky_webid/c/028.html

とうとうここまでやってきました。

登竜門ポインタ。

果たして僕にこの大きな壁を乗り越えることができるのであろうか。

ゆっくりじっくり読んでいこうと思います。

先程見たポインタ変数の初期化は、次のように置き換えることができます。

int num = 0;
int *p;
p = #

覚えるまでは分かりにくいですが、ポインタ変数にアドレスを代入するとき、ポインタ変数の方には「*」や「&」は付きません。

要チェックですね。

問題1

次のプログラムの実行結果を答えて下さい。

int main(void){
    int num, *p;
    
    num = 50;
    p = #
    
    printf( "%d\n", *p );
    return 0;
} 

まずnumに50を代入し、ポインタpにそのアドレスを代入します。

そしてポインタpを間接参照して表示してるだけなので答えは「50」ですね。

答え合わせ

あってた!

問題2

次のプログラムの実行結果を答えて下さい。

int main(void){
    int num1 = 0, num2 = 15;
    int *p;
    
    p = &num1;
    *p = *p + num2;
    
    p = &num2;
    *p = *p + num1;
    
    printf( "num1:%d  num2:%d\n", num1, num2 );
    return 0;
}

さてと、、、かなり複雑そうですが、一つずつ読み解いていけば大丈夫でしょう。

ポインタpにnum1のアドレスを代入

num2の値を加算する。この時点でnum1は「15」

ポインタpにnum2のアドレスを上書き代入

num1の値を加算する。この時点でnum2は「30」

よって出力結果は

num1:15 num2:30

となるはず。

答え合わせ

あってた!!

問題3

次のプログラムの実行結果を答えて下さい。

int main(void){
    int array[5] = { 1, 2, 3, 4, 5 };
    int *p;
    int i;
    
    for(i=0; i<5; ++i){
        p = &array[i];
        printf( "%d ", *p );
    }
    printf( "\n" );
    return 0;
}

ん?これは配列の一要素のアドレスをポインタpに代入して表示してるだけなので結局「1 2 3 4 5 」と表示されるだけの話では?

答え合わせ

あってた!!!



ポインタ第一回目は難しくなかったね。

次からだんだんと難しくなっていくのだろうか。

オッスオラわくわくしてきたぞ!