「C言語」の「構造体」の仕組みを学ぼう!
以前に「C言語」を学んだ時にはたぶんスルーしていたような気がするのですが、今回は「構造体」という機能について学んでいきたいと思います。
あともう少しと思いながら「C言語」を学んでいるのですが、思っていたよりもたくさんの機能があるので、「学び甲斐」があって、前よりは少し「C言語」にも慣れてきた気がします。
それでは、「構造体」の機能について勉強していきたいと思います!
「構造体」の仕組みと作り方
名前だけを聞くとどんな機能なのかあまりイメージができなかったのですが、「さまざまなデータ型」のデータをまとめて扱うことができる機能のようです。
それなら「配列でもいいんじゃないかな?」と思っていたのですが、よく考えてみると「配列」は「同じデータ型」のデータしか扱えない機能でした。
では、どうやってさまざまなデータ型のデータをまとめていくことができるんでしょうか。
「構造体」を作るためには、
struct 構造体名 { データ型 データ名; データ型 データ名; データ型 データ名; }
と書いていくのですが、
「人間」を表す「構造体」を作ってみると、
struct human { char name[50]; int age; };
他にも、「性別」「職業」「趣味」などいろんな項目を作れそうです。
「構造体」を利用したプログラムは、
#include <stdio.h> // 「構造体」を作る struct human { char name[50]; int age; }; int main(void) { // 「構造体」の内容を設定する struct human employee_1 = { "田中敏夫", 51 }; // 「構造体」の内容を表示する printf("名前=%s\n", employee_1.name); printf("年齢=%d\n", employee_1.age); return 0; }
のようになります。
このプログラムを実行すると、
名前=田中敏夫 年齢=51
のように表示されます。
データをまとめてグループ化できるような使い方ができますね。
同種のデータを複数扱う時は便利な機能だと思います。
「構造体データ」の配列での利用方法
「構造体」のデータを「配列」に格納して利用することもできます。
#include <stdio.h> struct human { char name[50]; int age; }; int main(void) { // 「構造体」を作る struct human employee_1 = { "田中敏夫", 51 }; struct human employee_2 = { "橋本菜々美", 27 }; struct human employee_3 = { "山本耀司", 35 }; // 「構造体」のデータを格納する配列を作る struct human humans[3]; // 「配列」にデータを格納する humans[0] = employee_1; humans[1] = employee_2; humans[2] = employee_3; // 「構造体」の内容を表示する printf("名前=%s\n", humans[0].name); printf("年齢=%d\n", humans[0].age); printf("名前=%s\n", humans[1].name); printf("年齢=%d\n", humans[1].age); printf("名前=%s\n", humans[2].name); printf("年齢=%d\n", humans[2].age); return 0; }
う~ん。これだとデータ数が増えたら「printf」関数がどんどん増えてしまいますね・・・
何か良い方法が無いかいろいろと調べていたら、「for文」を使うと、「配列」に対して一気に処理ができるとありました。
ただ、「配列の要素の個数」をどうやって取得すればいいのかがわからず、またいろいろ調べていき、「sizeof」という演算子を使うと、「データ型」のサイズや「変数」のサイズを調べることができるみたいです。
この「sizeof」演算子を使うことで、「配列の要素の個数」を調べることができます。
例えば、「int型」のデータが必要とするデータサイズを調べたい場合は、
#include <stdio.h> int main(void){ int i=0; int size = sizeof(i); printf("int型のデータサイズ=%d",size); return 0; }
のように書いて実行すると、
int型のデータサイズ=4
のように表示されるので、int型は「4」バイト使っていることがわかりますね。
「配列の要素の個数」を調べる
そして、構造体のデータを取得するときには、「構造体」に「別名」を割り当ててあげないと、「配列の要素の個数」を取得することができませんでした。
「構造体」の別名を付けるためには、
struct 構造体名 { データ型 データ名; データ型 データ名; データ型 データ名; }構造体の別名;
ように最後に「構造体の別名」を書くだけで別名を付けることができます。
今回は、「Human」という別名を付けることにしました。
別名を利用して、「配列の要素の個数」を取得するプログラムと、構造体の内容を表示するプログラムは、
#include <stdio.h> struct human { char name[50]; int age; }Human; int main(void) { // 「構造体」を作る struct human employee_1 = { "田中敏夫", 51 }; struct human employee_2 = { "橋本菜々美", 27 }; struct human employee_3 = { "山本耀司", 35 }; // 「構造体」のデータを格納する配列を作る struct human humans[3]; // 「配列」にデータを格納する humans[0] = employee_1; humans[1] = employee_2; humans[2] = employee_3; int size = sizeof(humans) / sizeof(Human); printf("配列データ個数=%d\n",size); for ( int i = 0; i < size; i++){ // 「構造体」の内容を表示する printf("名前=%s\n", humans[i].name); printf("年齢=%d\n", humans[i].age); } return 0; }
このプログラムを実行してみると、
配列データ個数=3 名前=田中敏夫 年齢=51 名前=橋本菜々美 年齢=27 名前=山本耀司 年齢=35
のように表示されます。
配列の要素の個数を取得している部分は、
int size = sizeof(humans) / sizeof(Human);
の部分ですが、
sizeof(humans)
で、「配列のデータサイズ」を取得し、
sizeof(Human)
の部分で、「構造体データ1つ分のデータサイズ」を取得しています。
なので、この2つの値を割ることで、「配列の要素の個数」を取得することができます。
「Javascript」だと「lengthプロパティ」を使えばすぐにわかるんだけど、このへんも手間がかかります・・・
プログラムを書く時の手間は「慣れる」しか無いので、どんどんプログラムを書いて「構造体」の作り方を習得していきたいと思います。
そろそろ「C言語」で何を作るのかを考えないとな~・・・