今回は《構造体について学ぼう》というテーマで記事をまとめます。
「構造体」を習得すると、更にバリエーションに富んだプログラムが書けるようになります。
尚、現在執筆中のC言語入門記事は以下の人を対象としています。
- プログラミング未経験の人
- C言語プログラミングの学習をこれから始めたい人
- C言語プログラミングの学習を始めたばかりの人
構造体について学ぼう
構造体とは
構造体とは、簡単に言うと「複数の情報を1つにまとめたもの」です。
配列も同じような表現で説明しましたね。配列でまとめることができるのは1つの型のみですが、構造体は複数の型をまとめることができます。
構造体の定義
構造体の変数を定義するには、まず、構造体そのものを定義する必要があります。
構造体の定義は次のように記述します。
/* 構造体の定義 */ struct 構造体名 { 変数の型 メンバ変数名; 変数の型 メンバ変数名; ... };
上記を見てもらえればわかる通り、構造体の中に定義されている変数のことを『メンバ変数(または、メンバ)』と呼びます。
メンバ変数は1つ以上定義する必要があり、その個数に上限はありません。(正確には開発環境によって上限値が決まっていますが、基本的には上限なしと考えてよいです)
具体的なソースコードは次のようになります。
/* 構造体の定義 */ struct person_info { char name[10]; int age; };
変数定義と使用方法
構造体の変数定義と使用方法は次のようになります。
/* 構造体の変数定義 */ struct 構造体名 変数名;
/* 構造体の使用方法 */ 変数名.メンバ変数名 = 値;
構造体の変数定義の『構造体名』には自分で定義した構造体の名前を入れる必要があります。そして、構造体のメンバ変数は"."繋ぎでメンバ変数名を記述することで代入や参照をすることができます。
それでは、サンプルを用意したので実行してみてください。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> /* 構造体の定義 */ struct person_info { char name[10]; int age; }; void main() { struct person_info person1; strcpy( person1.name, "tarou" ); person1.age = 17; printf( "person1.name = \"%s\"\n", person1.name ); printf( "person1.age = %d\n", person1.age ); }
構造体の配列
構造体変数も1つの変数であることは変わりない為、配列として変数を定義することができます。
/* 構造体の配列変数定義 */ struct 構造体名 変数名[要素数];
/* 構造体の配列変数の使用方法 */ 変数名[添字].メンバ変数名 = 値;
構造体の初期化
構造体変数も通常の変数と同様、初期化を行うことができます。書式は次のようになります。
/* 構造体変数の初期化 */ struct 構造体名 変数名 = { 値1, 値2, ... };
値は構造体のメンバ変数の数だけ指定し、その順番も定義されている順番で指定する必要があります。
具体的なコードは次のようになります。
/* 構造体の定義 */ struct person_info { char name[10]; int age; }; /* 構造体変数の初期化 */ struct person_info person = { "tarou", 17 };
構造体の代入
構造体変数は型が同じ場合、一括でメンバ変数に値を代入することができます。具体的なコードは次のようになります。
struct person_info person1 = { "tarou", 17 }; struct person_info person2; person2 = person1;
構造体変数定義の省略化【typedef】
構造体は変数を定義する度、基本的な変数の型(int, char, float等)と違い、"struct"というキーワードを記述する必要があります。
実は、この"struct"は省略することができます。"struct"を省略するには次のように構造体を定義します。
/* 構造体の定義 */ typedef struct { 変数の型 メンバ変数名; 変数の型 メンバ変数名; ... } 構造体名;
具体的なコードは次のようになります。
/* 構造体の定義 */ typedef struct { char name[10]; int age; } person_info; person_info person;
見知らぬキーワード"typedef"が出てきましたね。"typedef"を使用すると、「既存の型に別の名前を付ける」ことができます。
今回、この"typedef"を構造体変数定義の省略化に使用しましたが、別の用途でも使用します。使い方やよくある使用シーンなどについては、また別記事でまとめたいと思いますのでご期待ください。
次回は「ポインタ」について
今回は「構造体」について学んでもらいました。
次回は「ポインタ」について解説したいと思います。ポインタはC言語において『鬼門』であり、多くの人が「C言語が嫌いになる」要素の一つです。しかし、ポインタはC言語において「究極奥義」といっても過言ではない要素です。
ご期待ください。