Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で構造体の個々のメンバーを関数の引数として渡す方法

C言語では、構造体のデータを関数に渡す方法のひとつとして「個々のメンバーをそのまま引数として渡す」という手法があります。構造体全体ではなく必要なメンバーだけを引き渡すため、シンプルで分かりやすいコードを書くことができます。

  • 関数呼び出しの際に、構造体の各メンバーを個別の引数として指定します。
  • 関数側(仮引数)では、それらを通常の変数として独立して受け取ります。

サンプルプログラム

#include <stdio.h>

// 構造体の宣言
struct student {
    int s1, s2, s3;
} s[5];

// 各メンバーを引数として受け取り、合計点を表示する関数
void addition(int a, int b, int c) {
    int sum;
    // 算術演算
    sum = a + b + c;
    printf("合計点 = %d\n", sum);
}

int main(void) {
    int i;
    // 学生ごとの点数を入力
    for (i = 1; i < 4; i++) {
        printf("学生 %d の科目1の点数 = ", i);
        scanf("%d", &s[i].s1);
        printf("学生 %d の科目2の点数 = ", i);
        scanf("%d", &s[i].s2);
        printf("学生 %d の科目3の点数 = ", i);
        scanf("%d", &s[i].s3);
    }
    // 関数の呼び出し(メンバーを個別に渡す)
    for (i = 1; i < 4; i++) {
        printf("学生 %d : ", i);
        addition(s[i].s1, s[i].s2, s[i].s3);
    }
    return 0;
}

実行結果

学生 1 の科目1の点数 = 40
学生 1 の科目2の点数 = 55
学生 1 の科目3の点数 = 70
学生 2 の科目1の点数 = 30
学生 2 の科目2の点数 = 65
学生 2 の科目3の点数 = 85
学生 3 の科目1の点数 = 90
学生 3 の科目2の点数 = 45
学生 3 の科目3の点数 = 60
学生 1 : 合計点 = 165
学生 2 : 合計点 = 180
学生 3 : 合計点 = 195

プログラムのポイント

  • メンバーの個別渡し: 関数呼び出しの addition(s[i].s1, s[i].s2, s[i].s3) のように、ドット演算子(.)でアクセスした各メンバーの値を、独立した引数として渡しています。
  • 通常の変数で受け取り: 関数側の仮引数 int a, int b, int c は構造体とは無関係な普通の変数であり、渡された値のコピーが格納されます(値渡し)。そのため、関数内で値を変更しても元の構造体には影響しません。
  • ループとの組み合わせ: for ループの中で添字 i を変えながら関数を呼び出すことで、複数の学生データを順番に処理できます。

メリットと注意点

  • メリット: 必要なデータだけを渡せるため、関数の役割が明確になり、関数が構造体の内部構造に依存しなくなります。
  • 注意点: メンバーの数が多い場合は引数リストが長くなり、可読性や保守性が低下します。そのような場合には、構造体全体を渡す方法やポインタ渡しを検討するとよいでしょう。
  1. 構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説

    ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型

  2. Python関数の引数渡しの仕組みを解説!値渡しに見える理由とは

    Pythonでは、関数に引数を渡すとき、その動作が「値渡し(pass by value)」なのか「参照渡し(pass by reference)」なのか迷うことがあります。結論から言うと、Pythonの引数渡しは「オブジェクトへの参照渡し(pass by object reference)」です。ただし、オブジェクトの種類によって挙動が異なるため、「値渡しのように見える」ケースがあります。 サンプルコードの出力結果 b = 30 a = [10] この出力を見ると、変数aの値は関数呼び出し後も変わっていないように見えます。そのため「Pythonの引数は値渡しだ」と結論づけたくなりますが、実