【C言語】第6章第3回:ネストされた構造体の扱い方
ネストされた構造体を使用すると、複雑なデータ構造を簡単に管理できます。この章では、ネストされた構造体の定義、初期化、およびアクセス方法を学びます。
1. ネストされた構造体とは?
1.1 ネストされた構造体の概要
ネストされた構造体とは、構造体の中に別の構造体をメンバーとして含むデータ構造です。これにより、階層的なデータの表現が可能になります。
1.2 使用例
例えば、学生情報を管理する際、住所を別の構造体として扱い、学生構造体に組み込むことができます。
2. ネストされた構造体の定義と初期化
2.1 基本的な定義方法
#include <stdio.h>
// 住所を表す構造体
typedef struct {
char street[50];
char city[50];
char postalCode[10];
} Address;
// 学生を表す構造体
typedef struct {
char name[50];
int age;
Address address; // Address構造体をメンバーとして含む
} Student;
int main() {
// 構造体変数の宣言と初期化
Student student1 = {"Alice", 20, {"123 Main St", "Springfield", "12345"}};
// データの表示
printf("Name: %s\n", student1.name);
printf("Age: %d\n", student1.age);
printf("Address: %s, %s, %s\n", student1.address.street, student1.address.city, student1.address.postalCode);
return 0;
}
解説:
- Address構造体をStudent構造体のメンバーとして組み込んでいます。
- ネストされた構造体のメンバーにアクセスするには、ドット演算子を使用します。
2.2 ポインタを使った初期化
#include <stdio.h>
// 構造体の定義(省略)
int main() {
// 構造体ポインタの宣言と動的メモリ確保
Student *studentPtr = malloc(sizeof(Student));
// データの代入
strcpy(studentPtr->name, "Bob");
studentPtr->age = 22;
strcpy(studentPtr->address.street, "456 Elm St");
strcpy(studentPtr->address.city, "Metropolis");
strcpy(studentPtr->address.postalCode, "67890");
// データの表示
printf("Name: %s\n", studentPtr->name);
printf("Age: %d\n", studentPtr->age);
printf("Address: %s, %s, %s\n", studentPtr->address.street, studentPtr->address.city, studentPtr->address.postalCode);
// メモリの解放
free(studentPtr);
return 0;
}
解説:ポインタと動的メモリ確保を使用して、ネストされた構造体を初期化します。
3. ネストされた構造体の活用例
3.1 多数のデータを扱う例
複数の学生情報を管理する例を紹介します。
#include <stdio.h>
// 構造体の定義(省略)
int main() {
// 学生の配列を宣言
Student students[2] = {
{"Charlie", 19, {"789 Maple St", "Smalltown", "13579"}},
{"Daisy", 21, {"101 Oak St", "Bigcity", "24680"}}
};
// データの表示
for (int i = 0; i < 2; i++) {
printf("Student %d:\n", i + 1);
printf(" Name: %s\n", students[i].name);
printf(" Age: %d\n", students[i].age);
printf(" Address: %s, %s, %s\n", students[i].address.street, students[i].address.city, students[i].address.postalCode);
}
return 0;
}
解説:ネストされた構造体を配列で扱うことで、多くのデータを効率的に管理できます。
4. 練習問題
以下の課題に挑戦して、ネストされた構造体の理解を深めてください。
- 従業員の情報(名前、年齢、住所、部署)を管理するネストされた構造体を定義し、データを表示してください。
- 本の情報(タイトル、著者、出版社、価格)をネストされた構造体で表現し、初期化してください。
- ネストされた構造体を配列で管理し、全データを出力してください。
5. 練習問題の解答と解説
問1の解答
#include <stdio.h>
// 構造体の定義
typedef struct {
char department[50];
char location[50];
} Department;
typedef struct {
char name[50];
int age;
Department dept;
} Employee;
int main() {
// データの初期化
Employee emp = {"John Doe", 35, {"IT", "Head Office"}};
// データの表示
printf("Name: %s\n", emp.name);
printf("Age: %d\n", emp.age);
printf("Department: %s\n", emp.dept.department);
printf("Location: %s\n", emp.dept.location);
return 0;
}
解説:ネストされた構造体を使い、従業員情報を効率的に管理しています。
6. まとめ
ネストされた構造体を使用すると、階層的なデータ構造を簡単に表現できます。次回は、構造体配列とその応用について学びます。