複数のデータをまとめて扱うには配列を用いましたが、配列では同じ型のデータしかまとめて扱う事はできません。
実際にプログラムを組んでいると、異なる型のデータをまとめて扱いたい場合がしばしばあります。 たとえば、学生の成績を扱うときに、int型の学生番号と、char型配列の氏名と、double型の点数をまとめて扱えれば便利だと思いませんか。
実は、この章で学習する「構造体」は幾つかの異なる型のデータをまとめて 1つのデータ型として扱うものなのです。
サンプルプログラムを見ながら構造体の使用手順を説明します。
#include <stdio.h> /* (1)構造体の型枠の宣言 */ struct seiseki { int no; /* 学生番号 */ char name[20]; /* 氏名 */ double average; /* 平均値 */ }; int main(void) { int i; /* (2)構造体の宣言 */ /* (3)構造体の初期化 */ struct seiseki seito1 = { 5, "KASAHARA", 83.5 }; struct seiseki seito2[20] = { { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, }; /* (4)構造体の参照 */ printf("%d %s %5.1f\n\n",seito1.no,seito1.name,seito1.average); for(i = 0; i < 3; i++) { printf("%d %s %5.1f\n", seito2[i].no, seito2[i].name, seito2[i].average); } return 0; }
5 KASAHARA 83.5 1 SAKURAI 78.6 2 NAGANO 57.3 3 TAKESHITA 66.4
まず、複数のデータ(メンバと呼びます)をまとめて1つの構造体の型枠を宣言します。
この宣言は単に構造体の型を作ったにすぎず、領域の割当ては行われていません。
(書き方)struct タグ名 { データ型 メンバ名; }; |
(例)struct seiseki { int no; char name[20]; double average; }; |
※ この型枠の有効範囲は宣言する場所によって異なります。 関数外で宣言した場合 ⇒ その位置より下の全関数で有効 関数内で宣言した場合 ⇒ 宣言した関数内でのみ有効
(1)で作った「型枠」を使って実際にデータを宣言し、メモリ上に領域を確保します。
構造体は「構造体変数」として 1つの構造体を扱う事も出来ますし、複数の構造体をまとめて「構造体配列」として扱う事も出来ます。
(書き方)struct タグ名 変数名の並び; |
(例)struct seiseki seito1; struct seiseki seito2[20]; |
seiseki という構造をもつ seito1 という「変数」を宣言
seiseki という構造をもつ seito2 という「配列」を宣言
構造体は一般の変数や配列同様、(2)の宣言時に合わせて初期化を行う事が出来ます。
{ } の間に、各メンバ名をカンマで区切って記述。
struct seiseki seito1 = { 5, "KASAHARA", 83.5 };
各配列要素ごとに、{ } で区切って記述。
struct seiseki seito2[20] = { { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, };
構造体の各メンバは、「構造体変数名. メンバ名」のようにピリオド(.)を用いて指定します。
この(.)を「ドット演算子」と呼びます。
printf("%d %s %5.1f\n\n", seito1.no, seito1.name, seito1.average);
for(i = 0; i < 3; i++) { printf("%d %s %5.1f\n", seito2[i].no, seito2[i].name, seito2[i].average); }
※ 構造体変数や構造体配列は通常の変数や配列と同様に扱われます。 ですから記憶クラスも同様に指定することが出来ます。
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved