ポインタ①(概要) 解答ページ | Programming Place Plus C言語編 第31章

トップページC言語編第31章

問題①

問題① 次のプログラムの実行結果を答えてください。

#include <stdio.h>

int main(void)
{
    int num, *p;

    num = 50;
    p = &num;

    printf("%d\n", *p);
}


ポインタ変数p は、変数num のメモリアドレスを保持しています。したがって、間接演算子で間接参照すると、変数num をアクセスできます。変数num の値は 50 なので、出力結果は次のとおりです。

実行結果:

50

問題②

問題② 次のプログラムの実行結果を答えてください。

#include <stdio.h>

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);
}


ポインタ変数p には、まず変数num1 のメモリアドレスが代入されます。

*p = *p + num2;

がやや複雑ですが、ともかく間接演算子は、そのポインタ変数が保持しているメモリアドレスにあるものを参照するのだという点だけ理解していれば十分です。 結局のところ、この文の意味は、以下と同じことです。

num1 = num1 + num2;

num1 は 0、num2 は 15 なので、num1 が 15 になります。

その後、ポインタ変数p の値は、変数num2 のメモリアドレスで上書きされます。 そして今度は、以下に相当する文が実行されます。

num2 = num2 + num1;

この時点で、num1、num2 ともに 15 なので、加算の結果、num2 が 30 になります。 したがって、実行結果は次のようになります。

実行結果:

num1:15  num2:30

問題③

問題③ 次のプログラムの実行結果を答えてください。

#include <stdio.h>

int main(void)
{
    int array[5] = {1, 2, 3, 4, 5};
    int* p;

    for (int i = 0; i < 5; ++i) {
        p = &array[i];
        printf("%d ", *p);
    }
    printf("\n");
}


今度は、配列要素に対するメモリアドレスを保持するポインタですが、別段、難しくはありません。 各要素を順番に間接参照して、printf関数に渡しているだけです。

実行結果:

1 2 3 4 5

問題④

問題④ 次のプログラムの実行結果を答えてください。

#include <stdio.h>

typedef struct {
    float    x;
    float    y;
} PointF;

typedef struct {
    PointF  lt;
    PointF  rb;
} RectF;

int main(void)
{
    RectF   rect;
    RectF*  p_rect = &rect;
    PointF* p_point = &rect.lt;

    p_point->x = 15.0f;
    p_point->y = 20.0f;
    p_rect->rb.x = 10.0f;
    p_rect->rb.y = 30.0f;

    printf("%f %f %f %f\n", rect.lt.x, rect.lt.y, rect.rb.x, rect.rb.y);
}


今回は、構造体変数を指し示すポインタ変数です。

実行結果:

15.000000 20.000000 10.000000 30.000000



参考リンク


更新履歴

’2018/3/7 全面的に文章を見直し、修正を行った。

’2009/11/4 新規作成。



第31章のメインページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る