構造体

ユーザが定義するデータ型として「構造体」がある。

2次元のベクトル

int型データを二つ並べた「2次元ベクトル」のようなデータ型「Point」を自作する。

構造体の宣言は

typedef struct {
     int X;
     int Y;
}Point;

とする。Pointはデータ型の名前である。このように定義すると、以下のように使用できるようになる。

#include <stdio.h>
typedef struct {
     int X;
     int Y;
}Point;
int main(void) {
     Point p1 = { 1,2 };
     printf("(%d,%d)\n", p1.X, p1.Y);
     return 0;
}

実行結果. (1,2)

解説

Point型変数p1に対して、p1.X は第1成分、p1.Yは第2成分をあらわす。

main関数の初めの行

Point p1 = { 1,2 };

で p1.X=1 と p1.Y=2 と同じ処理を行っている。

次の行

printf("(%d,%d)\n", p1.X, p1.Y);

で、p1の各要素を表示しているが、いちいちこのようなコードを書くのも面倒なので、次のように メソッド化してしまうのが便利である。

Point型データの中身を表示する関数(display)を追加

#include <stdio.h>
typedef struct {
     int X;
     int Y;
}Point;
void display(Point p) {
     printf("(%d,%d)\n", p.X, p.Y);
}
int main(void) {
     Point p1 = { 1,2 };
     display(p1);
     return 0;
}

実行結果. (1,2)

Point型データを引数とするメソッドを追加することでベクトルらしい演算を定義することができる。

足し算を行う関数(add)を追加

#include <stdio.h>
typedef struct {
     int X;
     int Y;
}Point;
Point add(Point p1, Point p2) {
     Point p;
     p.X = p1.X + p2.X;
     p.Y = p1.Y + p2.Y;
     return p;
}
void display(Point p) {
     printf("(%d,%d)\n", p.X, p.Y);
}
int main(void) {
     Point p1 = { 1,2 };
     Point p2 = { 2,3 };
     display(add(p1, p2));
     return 0;
}

実行結果. (3,5)