C言語

【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. 練習問題

以下の課題に挑戦して、ネストされた構造体の理解を深めてください。

  1. 従業員の情報(名前、年齢、住所、部署)を管理するネストされた構造体を定義し、データを表示してください。
  2. 本の情報(タイトル、著者、出版社、価格)をネストされた構造体で表現し、初期化してください。
  3. ネストされた構造体を配列で管理し、全データを出力してください。

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. まとめ

ネストされた構造体を使用すると、階層的なデータ構造を簡単に表現できます。次回は、構造体配列とその応用について学びます。