C言語入門|構造体・配列を扱う関数

よーし、お疲れさま!
これで関数の基本はしっかり身につきましたね。

「引数」「戻り値」「スコープ」「プロトタイプ宣言」
ここまで理解できていれば、もう初心者ゾーンは卒業間近です。

そして、ここからが 関数の本当の出番
これまで学んできた 構造体配列 を、関数と組み合わせて使っていきます。

基本型だけじゃない、関数の引数と戻り値

これまでの例では、

  • int
  • char
  • double

といった 基本型 を引数や戻り値に使ってきました。

でも実は、関数はそれだけでは終わりません。

C言語では、

  • 構造体型
  • 配列型

といった 集成体型 も、関数の引数や戻り値として扱えます。

型の種類関数で使えるか
int などの基本型使える
構造体型使える
配列型使える

これができるようになると、
一気に「実践的なプログラム」っぽくなってきます。

構造体を引数として受け取る関数

まずは、構造体を引数に取る関数の例を見てみましょう。

// キャラクター情報を表示する関数
// 引数:Character型変数 戻り値:なし
void showCharacter(Character c)
{
    printf("%s Lv.%d (HP=%d)\n", c.name, c.level, c.hp);
}

この関数があれば、

showCharacter(hero);

と書くだけで、
キャラクターの情報をまとめて表示できます。

ポイント整理

項目内容
引数構造体を丸ごと受け取れる。
利点情報を1つのまとまりとして扱える。
効果呼び出し側のコードがスッキリする。

構造体を使うことで、
「名前」「HP」「レベル」などをバラバラに渡す必要がなくなるのが嬉しいところです。

配列を引数として受け取る関数

次は配列を扱う関数です。
配列は、ゲームや集計処理では欠かせない存在ですね。

// アイテム配列の中から指定IDの個数を数える関数
// 引数:配列items、検索ID 戻り値:個数
int countItem(int items[8], int target)
{
    int count = 0;

    for (int i = 0; i < 8; i++) {
        if (items[i] == target) {
            count++;
        }
    }

    return count;
}

呼び出し側では、次のように使えます。

int num;
num = countItem(items, POTION);

この関数の強み

ポイント内容
ループ処理関数の中に隠せる。
再利用性何度でも同じ処理を使える。
可読性main関数が読みやすくなる。

「配列を調べる処理」を関数に閉じ込めることで、
ゲームロジック全体がとても見通しよくなります。

構造体や配列を戻り値として返す

集成体型のすごいところは、
戻り値としても使える 点です。

たとえば、こんな関数を作れます。

// キャラクターを強化した新キャラを生成する関数
// 引数:Character型変数 戻り値:強化後Character
Character powerUp(Character c)
{
    Character pc;

    pc = c;          // 構造体をまとめてコピー
    pc.hp *= 2;
    pc.attack += 10;

    return pc;
}

この関数を使うと、

hero = powerUp(hero);

という1行で、
「強化後のキャラクター」を受け取れます。

集成体型を戻り値に使うメリット

ここで、集成体型を戻り値に使う最大のメリットを整理しておきましょう。

項目基本型集成体型
戻せる情報1つ複数まとめて
可読性普通とても良い
実用性小規模向け実践向け

戻り値は1つしか返せませんが、
構造体や配列を使えば「複数の情報」をまとめて返せる のです。

これは、関数設計において非常に強力な武器になります。

関数 × 構造体 × 配列が“壁”を超える鍵

関数の学習は、ここで一度大きな壁にぶつかります。

  • 引数が増えて混乱する。
  • 配列や構造体が絡んで読みにくくなる。

でも、この壁を越えると、

「関数は処理をまとめる道具」
「構造体や配列はデータをまとめる道具」

という役割分担が、はっきり見えてきます。