🇯🇵 日本語 | 🇺🇸 English

第21回 確認問題(配列)

配列のインデックス、sizeof、範囲外アクセスの理解度を確認しましょう。

確認問題1 ― 配列の初期化

int a[5] = {10, 20, 30, 40, 50};
printf("%d\n", a[2]);

出力結果は?

20
30
10
コンパイルエラー
解説: 配列のインデックスは0から始まる。a[0]=10, a[1]=20, a[2]=30

確認問題2 ― 配列の要素数

int a[] = {3, 1, 4, 1, 5, 9};
printf("%lu\n", sizeof(a) / sizeof(a[0]));

出力結果は?

4
6
24
1
解説: sizeof(a) は配列全体のバイト数(24)、sizeof(a[0]) は要素1つのバイト数(4)。
24 / 4 = 6。これは配列の要素数を求める定番テクニックです。

確認問題3 ― 範囲外アクセス

int a[3] = {10, 20, 30};
printf("%d\n", a[3]);

出力結果は?

0
30
コンパイルエラー
未定義動作(不定値)
解説: a[3] は範囲外(有効は a[0]〜a[2])。
Cではコンパイルエラーにならないが、未定義動作。何が起こるか保証されず、セキュリティホールにもなります。

確認問題4 ― forで配列を処理

int a[4] = {2, 4, 6, 8};
int sum = 0;
for (int i = 0; i < 4; i++) {
    sum += a[i];
}
printf("sum = %d\n", sum);

出力結果は?

sum = 16
sum = 20
sum = 10
sum = 8
解説: 2+4+6+8 = 20。配列の全要素を for で走査して合計する基本パターンです。

確認問題5 ― 部分初期化

int a[5] = {1, 2};
printf("%d %d %d\n", a[0], a[2], a[4]);

出力結果は?

1 2 不定値
1 0 0
コンパイルエラー
1 1 1
解説: 配列のサイズに対して初期化子が足りない場合、残りは 0 で埋められます
  • a[0]=1, a[1]=2(明示的に指定)
  • a[2], a[3], a[4] は自動的に 0
これは int a[5] = {0}; で全要素を 0 初期化するテクニックの根拠でもあります。

確認問題6 ― 2次元配列のアクセス

int m[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
printf("%d\n", m[1][2]);

出力結果は?

3
5
6
2
解説: m[行][列] という形式で、どちらも0 始まり
  • m[0] = {1, 2, 3}(1行目)
  • m[1] = {4, 5, 6}(2行目)
  • m[1][2] = 2行目の3番目 = 6
行列としてイメージすると分かりやすいです。

確認問題7 ― 配列の書き換え

int a[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    a[i] *= 2;
}
printf("%d\n", a[3]);

出力結果は?

4
8
6
10
解説: ループで全要素を2倍にします。
  • 元の配列: {1, 2, 3, 4, 5}
  • 2倍後: {2, 4, 6, 8, 10}
  • a[3] = 4 × 2 = 8
配列の要素はa[i] = 値で書き換えることができます。

確認問題8 ― sizeofで総バイト数

// int が 4 バイトの環境とする
int a[10];
printf("%lu\n", sizeof(a));

出力結果は?

10
40
4
8
解説: sizeof(配列) は配列全体の総バイト数を返します。
  • 要素1個のサイズ: sizeof(int) = 4 バイト
  • 要素数: 10
  • 配列全体: 4 × 10 = 40 バイト
なお、関数に渡すと配列はポインタに「成り下がる」ため、sizeof はポインタのサイズ(8 等)になります。配列の要素数を関数内で知りたい場合は別途引数で渡すのが定石です。

確認問題9 ― 配列名とポインタ

int a[3] = {10, 20, 30};
printf("%d\n", *a);

出力結果は?

10
30
アドレス値
コンパイルエラー
解説: 式の中で使われた配列名は、先頭要素へのポインタとして扱われます。
  • a&a[0] と同じ(先頭のアドレス)
  • *aa[0] と同じ(先頭の値)
  • したがって *a = 10
この関係はポインタ演算でも重要で、*(a+i)a[i] は等価です。

結果

回答してください
配列の講座に戻る ホームへ
← 前の講座
第20回 配列
次の講座 →
第22回 文字列

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ