C言語でデータを整理して扱いたいときに欠かせないのが構造体です。複数の異なる型のデータを1つにまとめて管理できるため、現実的な情報・人物・座標・商品などを表現するのに非常に便利です。この記事では、C言語 構造体の基本から、ポインタ・アロー演算子・関数引数での使い方までを丁寧に解説します。
構造体とは?C言語における基本データ構造を理解しよう
構造体の役割と目的
構造体・structとは、異なるデータ型を1つのまとまりとして扱うための仕組みです。たとえば、名前・文字列・年齢・整数・身長・小数といったデータを1つの人物情報としてまとめることができます。
struct Person {
char name[50];
int age;
float height;
};
構造体の基本的な概念については、構造体(C言語)入門:宣言・初期化・メンバアクセスでもわかりやすく解説されています。
構造体の宣言と初期化の基本
構造体を定義するには struct キーワードを使います。
struct Person {
char name[50];
int age;
float height;
};
struct Person p1;
typedefで簡略化
typedef を使うと、structを省略して使えるようになります。
typedef struct {
char name[50];
int age;
} Person;
Person p1; // structを省略
構造体の宣言・初期化方法やポインタとの組み合わせについては、構造体の基本(宣言・初期化・ポインタ)を解説の記事も参考になります。
構造体ポインタとアロー演算子の使い方
関数に構造体を渡すときなど、コピーを避けて効率的に処理するためにポインタを使用します。
Person p1 = {"Bob", 30};
Person *ptr = &p1
構造体ポインタを通してメンバを参照するには、-> アロー演算子を使います。
printf("%sの年齢は%d歳n", ptr->name, ptr->age);
これは次のコードと同じ意味です:
printf("%sの年齢は%d歳n", (*ptr).name, (*ptr).age);
アロー演算子やポインタ操作の具体的な例については、struct/ポインタ/アロー演算子を使った構造体活用が非常に丁寧です。
構造体のコピーと比較
構造体は = 演算子でそのままコピーできます。
Person p2 = p1;
構造体同士を直接比較 == することはできません。代わりに memcmp() でバイト単位の比較を行うか、メンバごとに比較します。
if (memcmp(&p1, &p2, sizeof(Person)) == 0) {
printf("同じデータです");
}
構造体の配列を使いこなす
構造体を配列にすると、複数のデータをまとめて管理できます。
Person people[3] = {
{"Alice", 25},
{"Bob", 30},
{"Charlie", 22}
};
for (int i = 0; i < 3; i++) {
printf("%s (%d歳)n", people[i].name, people[i].age);
}
関数で構造体を扱う方法
構造体をそのまま渡すと、関数内でコピーが作られます。
void showPerson(Person p) {
printf("%sは%d歳ですn", p.name, p.age);
}
ポインタを渡すことで、コピーせずに同じデータを操作できます。
void updateAge(Person *p) {
p->age += 1;
}
構造体を活用した応用例
構造体の中に別の構造体を含めることも可能です。
typedef struct {
int year, month, day;
} Date;
typedef struct {
char name[50];
Date birthday;
} Person;
大量のデータを処理する場合は、ポインタ配列で柔軟に管理できます。
まとめ|構造体を理解してプログラムを整理しよう
C言語 構造体は、異なるデータ型をひとつにまとめて扱うための基本構造です。アロー演算子 -> を使えば、ポインタ経由で構造体のメンバにアクセスできます。また、関数引数にポインタを渡すことで、構造体を効率的に処理することも可能です。
C言語 構造体をマスターすれば、データ構造の整理がしやすくなり、より実践的なプログラミングスキルが身につきます。次のステップとして、共用体・unionや列挙体・enumも学ぶと理解がさらに深まるでしょう。


