構造体は操作しやすくするために一つの名前でまとめられた事なった型の変数の集まりである。
■定義
struct point { int x; int y; };
■宣言
以下のようにして使用する。
int main(int argc, char *argv[]) { struct point a; a.x = 10; }
以下のように値を設定することもできる。
int main(int argc, char *argv[]) { struct point a = {10, 20}; }
同時に定義と宣言をする
以下のようにして定義と宣言を同時に行うことができる。
int main(int argc, char *argv[]) { struct { int x; int y; }a, b, c; a.x = 10; a.y = 10; b.x = 20; b.y = 20; c.x = 30; c.y = 30; }
関数の戻り値としての構造体
以下のような構造体を定義する。
struct point { int x; int y; };
関数の戻り値として上述の構造体を返すには以下のようにする。
struct point getPoint(int x, int y) { struct point p = {x, y}; return p; }
以下のようにして関数getPointを使用する。
int main(int argc, char *argv[]) { getPoint(10, 20); }
structは型のようなもんだし、クラスのような感じでさえある。
■応用
少し応用して以下のようにしてみる。
struct point { int x; int y; }; struct triangle { struct point p1; struct point p2; struct point p3; };
下のように各頂点を定義する。
int main(int argc, char *argv[]) { struct triangle a; a.p1.x = 5; a.p1.y = 1; a.p2.x = 7; a.p2.y = 6; a.p3.x = 9; a.p3.y = 1; }
■ポインタ
以下のように変数を宣言することでstruct point型へのポインタを表現できる。
struct point **pp;
以下のようにしてみる。
struct point a, *pp; a.x = 2; a.y = 4; pp = &a; printf("%d, %d", (*pp).x, (*pp).y);// 2, 4
これはよく用いられる一方で演算子の優先度のためにカッコで括る必要がある。手間なので同義の以下の表現が使用できる。
printf("%d, %d", pp->x, pp->y);