Previous: 標準関数 strcpy(), sscanf()
Up: 構造体 II
Previous Page: 標準関数 strcpy(), sscanf()
Next Page: 構造体 III
構造体のメンバーの型には、任意の型が使用できる。従って、既に宣言した タグ名のついた構造体をメンバーに含める事が出来る。
例1 struct point { int x; int y; }; struct triangle{ struct point t1, t2, t3; }; struct triangle a;
例のように宣言された struct triangle 型の変数 a は、 struct point 型のメンバー t1, t2, t3 を持つ。 struct point 型は、整数のメンバー x, y を持っているので、結局、 a.t1.x, a.t1.y, a.t2.x, a.t2.y, a.t3.x, a.t3.y という6個の実数変数が変数 a に含まれ ていることになる。
配列の確保は以下のようにする事を以前学んだが、
型 配列名[個数1][個数2]...[個数n];
この時の型は、C言語で許されている型ならば何でも良いのである。従って、 この型に構造体型を用いる事が出来る。
例えば、先の struct point ならば、
例2 struct point x[5];
とすれば、 struct point 型の大きさ5の配列が確保される。 勿論、これは、
例3 struct point x1, x2, x3, x4, x5;
とするのと良く似ているが、前者は配列なので添字でアクセス出来る点がポイントで ある。従って、アクセス方法は、例3では x1.x 等とするのに対し、 例2については、 x1 のところを配列要素で置き換えれば良いので、 x[1].x のように書けば良い。
ブロックの外で宣言された構造体タグ名と同じタグ名でブロックの内側で構造体を 宣言すると、ブロックの外側のタグ名は見えなくなる。これは、変数の場合と同じ であるが、この構造体の隠蔽は実際にはあまり使わない方が良い。
構造体の相互参照 ( 2つの構造体がお互いをメンバーに持つ ) は、特別な場合を 除いては出来ない。( 後で習うポインタを用いて、工夫すると出来る場合があるが、 何でも出来る訳ではない。)