C言語 #28: 構造体(Structures)

独習C

構造体は、異なるデータ型を一つの単位としてまとめることができるデータ構造です。C言語では、構造体を使用することで、複雑なデータを簡潔に表現し、管理することができます。C言語の構造体について、基本的な使い方から応用まで、具体例を交えて詳しく説明します。

1. 構造体の定義と宣言

構造体を使用するためには、まず構造体を定義し、その後に構造体変数を宣言します。

1.1 構造体の定義

#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

1.2 構造体変数の宣言と初期化

#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    // 構造体変数の宣言と初期化
    struct Person person1 = {"Taro", 20, 170.5};
    printf("名前: %s\n", person1.name);
    printf("年齢: %d\n", person1.age);
    printf("身長: %.1f\n", person1.height);
    return 0;
}

出力:

名前: Taro
年齢: 20
身長: 170.5

2. 構造体メンバへのアクセス

構造体メンバにアクセスするためには、ドット演算子(.)を使用します。

2.1 メンバへのアクセスと変更

#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    struct Person person1;
    // メンバへのアクセス
    person1.age = 25;
    person1.height = 175.0;
    strcpy(person1.name, "Jiro"); // 文字列のコピー

    printf("名前: %s\n", person1.name);
    printf("年齢: %d\n", person1.age);
    printf("身長: %.1f\n", person1.height);
    return 0;
}

出力:

名前: Jiro
年齢: 25
身長: 175.0

3. 構造体配列

構造体配列を使用することで、同じデータ構造の複数のインスタンスを管理することができます。

3.1 構造体配列の宣言と初期化

#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    // 構造体配列の宣言と初期化
    struct Person people[3] = {
        {"Taro", 20, 170.5},
        {"Jiro", 25, 175.0},
        {"Saburo", 30, 180.0}
    };

    for (int i = 0; i < 3; i++) {
        printf("名前: %s\n", people[i].name);
        printf("年齢: %d\n", people[i].age);
        printf("身長: %.1f\n", people[i].height);
    }
    return 0;
}

出力:

名前: Taro
年齢: 20
身長: 170.5
名前: Jiro
年齢: 25
身長: 175.0
名前: Saburo
年齢: 30
身長: 180.0

4. 構造体と関数

構造体を関数の引数や戻り値として使用することができます。

4.1 構造体を引数として渡す

#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

// 関数のプロトタイプ宣言
void printPerson(struct Person p);

int main() {
    struct Person person1 = {"Taro", 20, 170.5};
    printPerson(person1);
    return 0;
}

void printPerson(struct Person p) {
    printf("名前: %s\n", p.name);
    printf("年齢: %d\n", p.age);
    printf("身長: %.1f\n", p.height);
}

出力:

名前: Taro
年齢: 20
身長: 170.5

4.2 構造体を返す関数

#include <stdio.h>

// 構造体の定義
struct Person {
    char name[50];
    int age;
    float height;
};

// 関数のプロトタイプ宣言
struct Person createPerson(char name[], int age, float height);

int main() {
    struct Person person1 = createPerson("Taro", 20, 170.5);
    printf("名前: %s\n", person1.name);
    printf("年齢: %d\n", person1.age);
    printf("身長: %.1f\n", person1.height);
    return 0;
}

struct Person createPerson(char name[], int age, float height) {
    struct Person p;
    strcpy(p.name, name);
    p.age = age;
    p.height = height;
    return p;
}

出力:

名前: Taro
年齢: 20
身長: 170.5

5. ネストされた構造体

構造体の中に他の構造体を含めることができます。これにより、複雑なデータ構造を簡潔に表現できます。

5.1 ネストされた構造体の使用例

#include <stdio.h>

// 構造体の定義
struct Address {
    char city[50];
    char street[50];
    int zip;
};

struct Person {
    char name[50];
    int age;
    float height;
    struct Address address;
};

int main() {
    struct Person person1 = {"Taro", 20, 170.5, {"Tokyo", "Shibuya", 1500001}};
    printf("名前: %s\n", person1.name);
    printf("年齢: %d\n", person1.age);
    printf("身長: %.1f\n", person1.height);
    printf("住所: %s, %s, %d\n", person1.address.city, person1.address.street, person1.address.zip);
    return 0;
}

出力:

名前: Taro
年齢: 20
身長: 170.5
住所: Tokyo, Shibuya, 1500001

6. 総合例

以下に、ここまで学んだ構造体の知識を統合したプログラムを示します。このプログラムでは、構造体の定義と宣言、メンバへのアクセス、構造体配列、構造体を関数の引数や戻り値として使用する方法、ネストされた構造体の使用方法を紹介します。

#include <stdio.h>
#include <string.h>

// 構造体の定義
struct Address {
    char city[50];
    char street[50];
    int zip;
};

struct Person {
    char name[50];
    int age;
    float height;
    struct Address address;
};

// 関数のプロトタイプ宣言
void printPerson(struct Person p);
struct Person createPerson(char name[], int age, float height, char city[], char street[], int zip);

int main() {
    // 構造体配列の宣言と初期化
    struct Person people[2];
    people[0] = createPerson("Taro", 20, 170.5, "Tokyo", "Shibuya", 1500001);
    people[1] = createPerson("Jiro", 25, 175.0, "Osaka", "Namba", 5500002);

    for (int i = 0; i < 2; i++) {
        printPerson(people[i]);
    }
    return 0;
}

void printPerson(struct Person p) {
    printf("名前: %s\n", p.name);
    printf("年齢: %d\n", p.age);
    printf("身長: %.1f\n", p.height);
    printf("住所: %s, %s, %d\n", p.address.city, p.address.street, p.address.zip);
}

struct Person createPerson(char name[], int age, float height, char city[], char street[], int zip) {
    struct Person p;
    strcpy(p.name, name);
    p.age = age;
    p.height = height;
    strcpy(p.address.city, city);
    strcpy(p.address.street, street);
    p.address.zip = zip;
    return p;
}

結論

構造体は、C言語プログラミングにおいて非常に強力なデータ構造です。構造体を使用することで、複雑なデータを簡潔に表現し、管理することができます。これらの知識を活用して、より高度なプログラムを作成しましょう。

購読
通知
0 Comments
Inline Feedbacks
View all comments