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