構造体は、異なるデータ型を一つの単位としてまとめることができるデータ構造です。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言語プログラミングにおいて非常に強力なデータ構造です。構造体を使用することで、複雑なデータを簡潔に表現し、管理することができます。これらの知識を活用して、より高度なプログラムを作成しましょう。