ポインタ①(概要) 解答ページ | Programming Place Plus C言語編 第31章
Programming Place Plus トップページ – C言語編 – 第31章
問題① 次のプログラムの実行結果を答えてください。
#include <stdio.h>
int main(void)
{
int num, *p;
= 50;
num = #
p
( "%d\n", *p );
printf}
ポインタ変数p は、変数num のメモリアドレスを保持しています。したがって、間接演算子で間接参照すると、変数num をアクセスできます。変数num の値は 50 なので、出力結果は次のとおりです。
実行結果:
50
問題② 次のプログラムの実行結果を答えてください。
#include <stdio.h>
int main(void)
{
int num1 = 0, num2 = 15;
int* p;
= &num1;
p *p = *p + num2;
= &num2;
p *p = *p + num1;
( "num1:%d num2:%d\n", num1, num2 );
printf}
ポインタ変数p には、まず変数num1 のメモリアドレスが代入されます。
*p = *p + num2;
がやや複雑ですが、ともかく間接演算子は、そのポインタ変数が保持しているメモリアドレスにあるものを参照するのだという点だけ理解していれば十分です。 結局のところ、この文の意味は、以下と同じことです。
= num1 + num2; num1
num1 は 0、num2 は 15 なので、num1 が 15 になります。
その後、ポインタ変数p の値は、変数num2 のメモリアドレスで上書きされます。 そして今度は、以下に相当する文が実行されます。
= num2 + num1; num2
この時点で、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 ){
= &array[i];
p ( "%d ", *p );
printf}
( "\n" );
printf}
今度は、配列要素に対するメモリアドレスを保持するポインタですが、別段、難しくはありません。 各要素を順番に間接参照して、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* pRect = ▭
RectF* pPoint = &rect.lt;
PointF
->x = 15.0f;
pPoint->y = 20.0f;
pPoint->rb.x = 10.0f;
pRect->rb.y = 30.0f;
pRect
( "%f %f %f %f\n", rect.lt.x, rect.lt.y, rect.rb.x, rect.rb.y );
printf}
今回は、構造体変数を指し示すポインタ変数です。
実行結果:
15.000000 20.000000 10.000000 30.000000
return 0;
を削除(C言語編全体でのコードの統一)’2018/3/7 全面的に文章を見直し、修正を行った。
’2009/11/4 新規作成。
Programming Place Plus のトップページへ