I thought what I'd do was. I'd pretend I was one of those deaf-mutes or should I?

構造体いらんかえ?

C言語プログラマへの階段「構造体-KOUZOUTAI-」(んな、大袈裟な)。そんなわけで、「構造体」について簡単にまとめておきます。

構造体の作り方

「習うより、慣れろ」というわけで、いくつか例を出してみます

// 2次元座標(x,y)を表す構造体の定義
struct POINT2
{
 int x;
 int y;
};
// 3次元座標(x,y,z)を表す構造体の定義
struct POINT3
{
 int x;
 int y;
 int z;
};

何か難しいでしょうか? ようわ、structの後ろに構造体の名前(タグ名という)を書いて中括弧の内側にその中身を定義する、それだけです。他にも、例をあげます。

// Compact Disc
struct CD
{
 char artist[MAX_CHAR_LENGTH];
 int  year;
 int  month;
 int  day;
 char label[MAX_CHAR_LENGTH];
 int  num_of_track;
};

音楽CDの情報を構造体にしてみました(トラック名まで持たせるのは面倒なので、ちょっとアレなんでありませんが)。さっきの例では、中括弧の中には、int型の変数しかありませんでしたが、別にchar型でもいけます。もちろんdoubleでもfloatでもOKです。もっといえば、構造体だって共用体だって持てます。

ここで、名前を整理しておきます。

まず、structの後ろにあるのが「タグ名」。これが定義した構造体の名前です。食事のときに「お醤油どこ〜?」というのと同じで、プログラミングのときに「POINT2構造体どこ〜?」と叫ぶことになるでしょう(。-_-。 )

中括弧の中に書く、変数や構造体のことは「メンバ」と呼びます。たとえば「CD構造体のyearメンバに2005を代入」という感じです。

構造体の使い方

使い方はいたってシンプル。普通の変数の宣言と同じように

struct POINT2 tarou, jirou;
struct CD elle_missing;

というふうに書きます。ちょっと頭に「struct」なんてキザなもんが付いてるだけで、何も難しくないと思います。ただし、C++の場合はstructを頭に付ける必要ありません。で、各メンバの値を知りたいとき、変更したいときは、次のようにします。

struct POINT2 tarou, jirou;

// 太郎くんは座標(6,10)にいる
tarou.x = 6;
tarou.y = 10;

// 太郎くんはX軸方向に3だけ移動した
tarou.x += 3;

// 太郎くんのいる場所には弟の次郎くんがいた
jirou.x = tarou.x;
jirou.y = jirou.y;

構造体のメンバ名の直前にピリオド(.)を書いてるだけですね。CD構造体のmonthが知りたければ「elle_missing.month」のように書きます。

落穂拾い

さっきの例は、もっと短く書き直すことができます。

// 太郎くんは座標(6,10)にいる、次郎くんは行方不明
struct POINT2 tarou={6,10}, jirou;

// 太郎くんはX軸方向に3だけ移動した
tarou.x += 3;

// 太郎くんのいる場所には弟の次郎くんがいた
jirou = tarou;

まず、構造体の初期化は一括して行えます。なので、いちいち「tarou.x = 6; tarou.y = 10;」のようにする必要ありません。が、しかし、勘違いしてはいけないのが、一括に値を代入できるのは、初期化のときだけです。初期化部分以外でやっても、コンパイルエラーになります(コンパイラによっては通るかも・。・)。

次に、次郎くんの座標を太郎くんと同じ座標にする部分。これは、jirouもtarouも両方ともPOINT2構造体なので普通の変数のように代入が可能です。ただし、次のように足し算や引き算などはできません。

tarou += jirou;

そんなこんなで、構造体の基本は、これだけです。基本は難しくありませんが、ようわ「どんなときに使うの?」かです。一概には言えませんが、複数の変数があって扱う場所は同じなんだけど、っていうときに構造体にまとめます。あと関数の引数がやたらめったら増えてきたときも構造体にまとめるようです(私はあまりしませんが)。基本は「オブジェクト」という考え方だと思います。オブジェクト指向のオブジェクトです。変数に注目するんじゃなくて、オブジェクト(物、パーツ)に注目するのです。よくわからなくても、いずれはわかる・・・かもしれません。

Comments are welcome! We can be reached at whoinside_reshia@hotmail.co.jp
2005/03/21 13:32:09 UTC