問題① 次のプログラムの実行結果を答えてください。
#include <stdio.h>
int main(void)
{
int num, *p;
num = 50;
p = #
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 = ▭
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
{ の直後と、} の直前に空白を入れない)() の前後の空白の空け方)( の直後、) の直前に空白を入れない)return 0; を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
| はてなブックマーク に保存 | Facebook でシェア | X で ポスト/フォロー |
| LINE で送る | noteで書く |
|
| 管理者情報 | プライバシーポリシー |