【C言語】構造体全体を引数として関数に渡す方法を徹底解説
はじめに:構造体を受け渡す3つの方法
C言語において、構造体の値をある関数から別の関数へ渡す方法は、主に次の3つがあります。
- 各メンバーを個別に引数として渡す
- 構造体全体を1つの引数として渡す
- 構造体のアドレス(ポインタ)を引数として渡す
本記事では、この中から「構造体全体を引数として関数に渡す方法」について、具体的なサンプルコードとともに詳しく解説します。
構造体全体を渡す場合のポイント
- 関数を呼び出す際、構造体変数の名前をそのまま引数に指定します。
- 関数側では、同じ構造体型の別の変数でその値を受け取ります。
- 注意点として、呼び出しのたびに構造体全体のコピーが新たに作成されるため、メモリを余分に消費するというデメリットがあります。
サンプル1:日付構造体を関数に渡す
まずは基本となる例です。「日・月・年」を持つ日付構造体を、そのまま関数に渡して表示します。
#include<stdio.h>
struct date{
int day;
char month[10];
int year;
};
int main(){
struct date d;
printf("enter the day,month and year:");
scanf("%d%s%d",&d.day,d.month,&d.year);
display(d);// 構造体全体を引数として関数に渡す
return 0;
}
void display(struct date d){
printf("day=%d\n",d.day);
printf("month=%s\n",d.month);
printf("year=%d\n",d.year);
}
実行結果
上記プログラムを実行すると、次のような出力が得られます。
enter the day, month and year:18 JAN 2021 day=18 month=JAN year=2021
サンプル2:2つの整数を持つ構造体を渡して加算する
次の例では、構造体内の2つの整数を関数の中で加算します。構造体の宣言方法や、値を受け取る関数の定義の書き方を確認しましょう。
#include<stdio.h>
// 構造体の宣言 //
struct add{
int var1;
int var2;
}a;
// 関数の宣言 //
void show(struct add a){
// 合計用変数の宣言 //
int sum;
// 加算処理 //
sum=a.var1+a.var2;
// 結果の出力 //
printf("Added value is %d",sum);
}
void main(){
// 構造体の宣言 //
struct add a;
// ユーザー入力の読み取り //
printf("Enter variable 1 = ");
scanf("%d",&a.var1);
printf("Enter variable 2 = ");
scanf("%d",&a.var2);
// 関数の呼び出し //
show(a);
}
実行結果
上記プログラムを実行すると、次のような出力が得られます。
Enter variable 1 = 20 Enter variable 2 = 50 Added value is 70
サンプル3:構造体配列を渡して生徒ごとの合計点を計算する
最後に、構造体配列を引数として渡す例を紹介します。複数の生徒の3教科の点数を入力し、関数側で各自の合計点を計算して表示します。
#include<stdio.h>
// 構造体の宣言 //
struct student{
int s1,s2,s3;
}s[5];
// 関数の宣言 //
void addition(struct student s[]){
// ループ変数と合計用変数の宣言 //
int i,sum;
// 加算処理 //
for(i=1;i<4;i++){
sum=s[i].s1+s[i].s2+s[i].s3;
printf("Student %d scored total of %d\n",i,sum);
}
}
void main(){
// ループ用変数の宣言 //
int i;
// forループによるユーザー入力の読み取り //
for(i=1;i<4;i++){
printf("Enter marks for student %d in subject 1 = ",i);
scanf("%d",&s[i].s1);
printf("Enter marks for student %d in subject 2 = ",i);
scanf("%d",&s[i].s2);
printf("Enter marks for student %d in subject 3 = ",i);
scanf("%d",&s[i].s3);
}
// 関数の呼び出し //
addition(s);
}
実行結果
上記プログラムを実行すると、次のような出力が得られます。
Enter marks for student 1 in subject 1 = 25 Enter marks for student 1 in subject 2 = 89 Enter marks for student 1 in subject 3 = 45 Enter marks for student 2 in subject 1 = 12 Enter marks for student 2 in subject 2 = 45 Enter marks for student 2 in subject 3 = 89 Enter marks for student 3 in subject 1 = 12 Enter marks for student 3 in subject 2 = 78 Enter marks for student 3 in subject 3 = 12 Student 1 scored total of 159 Student 2 scored total of 146 Student 3 scored total of 102
まとめ
構造体全体を引数として渡せば、関連する複数のデータをひとまとめにして関数へ簡単に引き渡せます。一方で、呼び出しごとに構造体全体のコピーが作られるため、大きな構造体や頻繁な呼び出しが発生する場面では、メモリ効率の観点から「アドレス渡し(ポインタ渡し)」を検討するのも有効な選択肢です。
-
【Python】TkinterでEnterキーを関数にバインドする方法
キーボードのキーが押されたときに特定の処理を実行することは、ボタン操作と同様にイベントとして扱うことができます。Tkinterアプリケーションでは、bindメソッドを使ってキーイベントをウィジェットやウィンドウに紐付ける(バインドする)ことが可能です。キーイベントが発生すると、あらかじめ登録しておいたハンドラ関数が呼び出され、そのキーに対応した処理が実行されます。bindメソッドの基本構文任意のキーイベントをトリガーしたい場合は、bind(<Key>, ハンドラ) の形式を使用します。特にEnterキーに対応させたい場合は、bind(<Return>, ハンドラ) を使
-
Pythonで関数を引数として渡す方法をわかりやすく解説
Pythonでは、関数もオブジェクトの一つとして扱われるため、他の関数の引数として渡すことができます。この仕組みを活用すると、柔軟で再利用性の高いコードを書くことができます。map()関数を使った例Pythonが標準で提供している代表的な例が、第一引数に関数を受け取る map() 関数です。map(function, iterable, ...) — iterable(イテラブル)の各要素に対してfunctionを適用し、その結果を返します。もちろん、独自に定義したカスタム関数でも、引数として関数を受け取るように実装できます。自作関数sqr(x)を引数として渡すここでは、リストの各要素を2乗す