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 を変えながら関数を呼び出すことで、複数の学生データを順番に処理できます。
メリットと注意点
- メリット: 必要なデータだけを渡せるため、関数の役割が明確になり、関数が構造体の内部構造に依存しなくなります。
- 注意点: メンバーの数が多い場合は引数リストが長くなり、可読性や保守性が低下します。そのような場合には、構造体全体を渡す方法やポインタ渡しを検討するとよいでしょう。
-
構造体の概念で理解するC言語のビットフィールド|定義方法と範囲の計算を徹底解説
ビットフィールドとはビットフィールドとは、変数が占めるメモリのサイズをビット単位で指定できるC言語の機能です。通常は構造体(struct)の中で定義されます。ビットフィールドの基本:1バイト=8ビット記述例struct info { int x : 2; };この例では、メンバxは2ビットを占有します。ビットフィールド使用時の注意点ビットフィールドの範囲外の値を代入することはできません(その場合の動作は保証されません)。sizeof演算子やアドレス演算子(&)をビットフィールドに適用できないため、scanf関数で値を入力することもできません。ビットフィールドに指定できるデータ型
-
Python関数の引数渡しの仕組みを解説!値渡しに見える理由とは
Pythonでは、関数に引数を渡すとき、その動作が「値渡し(pass by value)」なのか「参照渡し(pass by reference)」なのか迷うことがあります。結論から言うと、Pythonの引数渡しは「オブジェクトへの参照渡し(pass by object reference)」です。ただし、オブジェクトの種類によって挙動が異なるため、「値渡しのように見える」ケースがあります。 サンプルコードの出力結果 b = 30 a = [10] この出力を見ると、変数aの値は関数呼び出し後も変わっていないように見えます。そのため「Pythonの引数は値渡しだ」と結論づけたくなりますが、実