C言語 構造体: 関数への渡し方・返し方・参照渡しをマスター
C言語 構造体: 渡し方、返し方、参照渡し
Cプログラミングでは、構造体で関連データを1つのエンティティにグループ化できます。このガイドでは、構造体の3つの重要な操作:関数への渡し方、関数からの返し方、参照による操作を解説します。各セクションに簡潔な説明と動作例を含め、理解を深めます。
構造体を関数に渡す
組み込み型と同様に、構造体変数を直接関数に渡せます。事前にC構造体、C関数、ユーザー定義関数を復習すると理解が深まります。
- C構造体
- C関数
- ユーザー定義関数
以下の例は、struct studentを関数に渡して内容を表示する方法を示します。
#include <stdio.h>
struct student {
char name[50];
int age;
};
// 関数プロトタイプ
void display(struct student s);
int main() {
struct student s1;
printf("Enter name: ");
scanf("%[^ ]%%*c", s1.name); // 改行まで読み取り
printf("Enter age: ");
scanf("%d", &s1.age);
display(s1); // 構造体を関数に渡す
return 0;
}
void display(struct student s) {
printf("\nDisplaying information\n");
printf("Name: %s", s.name);
printf("\nAge: %d", s.age);
}
出力
Enter name: Bond Enter age: 13 Displaying information Name: Bond Age: 13
関数から構造体を返す
関数は構造体全体を返せるため、データ収集と処理をきれいに分離できます。以下の例では、関数内で学生情報を収集し、mainに返します。
#include <stdio.h>
struct student {
char name[50];
int age;
};
// 関数プロトタイプ
struct student getInformation();
int main() {
struct student s;
s = getInformation();
printf("\nDisplaying information\n");
printf("Name: %s", s.name);
printf("\nAge: %d", s.age);
return 0;
}
struct student getInformation() {
struct student s1;
printf("Enter name: ");
scanf("%[^ ]%%*c", s1.name);
printf("Enter age: ");
scanf("%d", &s1.age);
return s1;
}
関数の戻り値型が返す構造体と一致し、型安全性と明確性を確保しています。
構造体を参照渡しする
関数で構造体を変更する必要がある場合、そのアドレス(ポインタ)を渡します。これは組み込み型の参照渡しと同様です。以下の例では、2つの複素数を加算し、結果をポインタ経由で格納します。
#include <stdio.h>
typedef struct Complex {
float real;
float imag;
} complex;
void addNumbers(complex c1, complex c2, complex *result);
int main() {
complex c1, c2, result;
printf("For first number,\n");
printf("Enter real part: ");
scanf("%f", &c1.real);
printf("Enter imaginary part: ");
scanf("%f", &c1.imag);
printf("For second number,\n");
printf("Enter real part: ");
scanf("%f", &c2.real);
printf("Enter imaginary part: ");
scanf("%f", &c2.imag);
addNumbers(c1, c2, &result);
printf("\nresult.real = %.1f\n", result.real);
printf("result.imag = %.1f", result.imag);
return 0;
}
void addNumbers(complex c1, complex c2, complex *result) {
result->real = c1.real + c2.real;
result->imag = c1.imag + c2.imag;
}
出力
For first number, Enter real part: 1.1 Enter imaginary part: -2.4 For second number, Enter real part: 3.4 Enter imaginary part: -3.2 result.real = 4.5 result.imag = -5.6
resultが参照渡しされているため、addNumbers内の変更が即座にmainの変数に反映されます。
これらの技法をマスターすれば、構造体の全威力を活用した、よりモジュール化され、読みやすく、効率的なCコードが書けるようになります。
C言語
- 電気変圧器の仕組み:機能、構造、産業用途を徹底解説
- 旋盤の15の主要コンポーネントとその機能を徹底解説
- C#構造体(struct)完全ガイド:定義、活用、クラスとの違い
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C言語 構造体 完全マスター: 定義・変数・アクセス・高度な例
- C言語 構造体とポインタ: 実践ガイド
- Cプログラム構造の理解:初心者向けガイド
- C言語のデータ型完全ガイド:整数、浮動小数点、void型
- C言語の定数とリテラル:型、使い方、ベストプラクティス
- C言語の関数マスター:構造、宣言、ベストプラクティス
- C++オーバーロード完全マスター:関数と演算子のオーバーロード