構造体について

最終更新日:2004-06-17.

今回は、構造体変数、構造体変数へのポインタについてちょっと。

日付・時刻データとか、あるグループの名簿とか、関連のある複数の変数を
まとめて処理する場合構造体を使用すると便利です。
構造体には型枠があり、その中に使用する複数の変数があります。
それらを構造体変数で管理します。
実際の処理はその構造体の各メンバーにアクセスします。
また、構造体変数へのポインタを使用するとデータの受け渡しなどで
便利です。

・構造体

構造体(structure)を使うと、いろいろな型の複数のデータを
まとめて処理することができます。

例えば、現在の時刻やファイルの更新日時などを処理する場合、
年・月・日・時・分・秒などのデータを扱います。

LSICのマニュアルを見ると、構造体宣言(struct tm)は
以下のようになっています。

struct tm {
int tm_sec; /* 秒(0-59) */
int tm_min; /* 分(0-59) */
int tm_hour; /* 時(0-23) */
int tm_mday; /* 日(1-31) */
int tm_mon; /* 月(0-11) */
int tm_year; /* 西暦年-1900 */
int tm_wday; /* 曜日(0-6) */
int tm_yday; /* 通算日数(0-365) */
int tm_isdst; /* サマータイムフラグ */
};

上記の内、「tm」を型枠名といい、構造体で扱っている各変数を
メンバー名といいます。

ここでは、まだ型枠しか用意していません。
実際にこれを使用するには、構造体変数を宣言します。

struct tm x;

これで、構造体変数 xが使用できます。
そして、この xには九つのメンバーがいます。
各メンバーにアクセスするには、変数名とメンバー名を半角のピリオド(.)で
結びます。

x.tm_sec;
x.tm_min;
x.tm_hour;
x.tm_mday;
x.tm_mon;
x.tm_year;
x.tm_wday;
x.tm_yday;
x.tm_isdst;

また、構造体変数のところを構造体変数へのポインタ
とすることもできます。

struct tm *y;

これで、構造体変数へのポインタ*yが使用できます。
そして、このポインタから構造体メンバーにアクセスするには、
ポインタ名とメンバー名をハイフンと大なり記号(->)で
結びます。

y->tm_sec;
y->tm_min;
y->tm_hour;
y->tm_mday;
y->tm_mon;
y->tm_year;
y->tm_wday;
y->tm_yday;
y->tm_isdst;

では、それらをソースで見てみましょう。
+------------------------------------------------------------+
/* filename=no012-1.c */
/* include */
#include <stdio.h>
#include <time.h>
/* main */
int main( )
{
/* 通算秒数 */
long t;
/* 構造体 */
struct tm *y;
/* 現在時刻 */
t=time(NULL);
/* 時刻データを変換する */
y=localtime(&t);
/* データの修正 */
(y->tm_year)+=1900;
(y->tm_mon)+=1;
printf("DATE=%04d/%02d/%02d\n",
y->tm_year, y->tm_mon, y->tm_mday);
printf("TIME=%02d:%02d:%02d\n",
y->tm_hour, y->tm_min, y->tm_sec);
return 0;/* 終了 */
}
+------------------------------------------------------------+

上記のソースをコンパイルして実行すると以下のように表示されました。
DATE=2004/06/17
TIME=21:14:56

戻る