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

先頭へ戻る

問題①

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

#include <stdio.h>

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

    num = 50;
    p = &num;

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

    return 0;
}


ポインタ変数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 );
	
	return 0;
}


ポインタ変数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;
    int i;

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

    return 0;
}


今度は、配列要素に対するメモリアドレスを保持するポインタですが、別段、難しくはありません。 各要素を順番に間接参照して、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*  pRect = &rect;
    PointF* pPoint = &rect.lt;

    pPoint->x = 15.0f;
    pPoint->y = 20.0f;
    pRect->rb.x = 10.0f;
    pRect->rb.y = 30.0f;

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

    return 0;
}


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

実行結果:

15.000000 20.000000 10.000000 30.000000



参考リンク



更新履歴

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

'2009/11/4 新規作成。



第31章のメインページへ

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

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS