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

【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

まとめ

構造体全体を引数として渡せば、関連する複数のデータをひとまとめにして関数へ簡単に引き渡せます。一方で、呼び出しごとに構造体全体のコピーが作られるため、大きな構造体や頻繁な呼び出しが発生する場面では、メモリ効率の観点から「アドレス渡し(ポインタ渡し)」を検討するのも有効な選択肢です。

  1. 【Python】TkinterでEnterキーを関数にバインドする方法

    キーボードのキーが押されたときに特定の処理を実行することは、ボタン操作と同様にイベントとして扱うことができます。Tkinterアプリケーションでは、bindメソッドを使ってキーイベントをウィジェットやウィンドウに紐付ける(バインドする)ことが可能です。キーイベントが発生すると、あらかじめ登録しておいたハンドラ関数が呼び出され、そのキーに対応した処理が実行されます。bindメソッドの基本構文任意のキーイベントをトリガーしたい場合は、bind(<Key>, ハンドラ) の形式を使用します。特にEnterキーに対応させたい場合は、bind(<Return>, ハンドラ) を使

  2. Pythonで関数を引数として渡す方法をわかりやすく解説

    Pythonでは、関数もオブジェクトの一つとして扱われるため、他の関数の引数として渡すことができます。この仕組みを活用すると、柔軟で再利用性の高いコードを書くことができます。map()関数を使った例Pythonが標準で提供している代表的な例が、第一引数に関数を受け取る map() 関数です。map(function, iterable, ...) — iterable(イテラブル)の各要素に対してfunctionを適用し、その結果を返します。もちろん、独自に定義したカスタム関数でも、引数として関数を受け取るように実装できます。自作関数sqr(x)を引数として渡すここでは、リストの各要素を2乗す