
「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言語」で何を作るのかを考えないとな~・・・