9-1 構造体

この記事は約5分で読めます。

構造体とは

同じ型の変数をいくつも使用するときは配列としてまとめて定義、使用することができました。しかし、実際は異なる型の変数をまとめて扱いたい場合があります。そんな時に、構造体が使えます。構造体をつかうには、構造体がどんな型かを定義する必要があります。

構造体の定義方法

struct タグ名{
	型名 メンバ名;
	...
};

構造体を定義すると、struct タグ名を型として使用できます。構造体内の変数をメンバ変数、または単にメンバと呼びます。

struct タグ名 変数名;

「struct タグ名」型の変数が定義できました。メンバにアクセスするには、メンバ演算子.を用いて

変数名.メンバ名

とします。とりあえず、サンプルコードをご覧ください。

#include <stdio.h>
struct tagperson{
	char name[20];
	int age;
};
int main(void) {
	struct tagperson you;
	puts("名前を入力してください。");
	scanf("%s",you.name);
	puts("年齢は?");
	scanf("%d",&you.age);
	printf("あなたの名前=%s\nあなたの年齢=%d\n",you.name,you.age);
	return 0;
}

実行結果

名前を入力してください。
gukos
年齢は?
19
あなたの名前=gukos
あなたの年齢=19

このコードでは、まずtagpersonという構造体を定義します。そのあと、struct tagperson型の変数youを定義しました。youのメンバnameにアクセスするにはyou.nameとします。

構造体と変数を同時に定義する

構造体を定義するときに同時に変数を定義できます。

struct タグ名{
	型名 メンバ名;
	...
}変数名1,変数名2,...;

構造体の定義と同時に変数を定義しても、普通にstruct タグ名から変数を定義することもできます。

#include <stdio.h>
#include <string.h>
struct tagperson{
	char name[20];
	int age;
}you;
int main(void) {
	struct tagperson me;
	puts("名前を入力してください。");
	scanf("%s",you.name);
	puts("年齢は?");
	scanf("%d",&you.age);
	printf("あなたの名前=%s\nあなたの年齢=%d\n",you.name,you.age);
	strcpy(me.name,"山田太郎");
	me.age=20;
	printf("私の名前=%s\n私の年齢=%d\n",me.name,me.age);
	return 0;
}

実行結果

名前を入力してください。
gukos
年齢は?
19
あなたの名前=gukos
あなたの年齢=19
私の名前=山田太郎
私の年齢=20

また、構造体を定義するときに同時に変数を定義すると、タグ名を省略できます。しかし、タグ名を省略すると構造体を定義した場所以外で変数を定義できません。

タグ名を省略すると、上のプログラムの構造体の定義部分はこうなります。

struct tagperson{
	char name[20];
	int age;
}you,me;

structを省略する。

構造体の変数を定義するときに、わざわざstructをつけるのは面倒です。そんなときは、構造体の定義とtypedef宣言を組み合わせると構造体の変数を定義しやすくなります。

typedef 元の型名 新しい型名; (3-2より)
struct タグ名{
	型名 メンバ名;
	...
};
typedef struct タグ名 構造体型名;

これらを組み合わせて、

typedef struct タグ名{
	型名 メンバ名;
	...
}構造体型名;

と書けます。ただし、この場合構造体の定義と同時に変数を定義することはできません。

typedef宣言を用いてプログラムを書き直すとこうなります。もちろんタグ名を用いて宣言することもできます。

#include <stdio.h>
#include <string.h>
typedef struct tagperson{
	char name[20];
	int age;
}person;
int main(void) {
	person you;
	struct tagperson me;
	puts("名前を入力してください。");
	scanf("%s",you.name);
	puts("年齢は?");
	scanf("%d",&you.age);
	printf("あなたの名前=%s\nあなたの年齢=%d\n",you.name,you.age);
	strcpy(me.name,"山田太郎");
	me.age=20;
	printf("私の名前=%s\n私の年齢=%d\n",me.name,me.age);
	return 0;
}

実行結果

名前を入力してください。
gukos
年齢は?
19
あなたの名前=gukos
あなたの年齢=19
私の名前=山田太郎
私の年齢=20

まとめ

様々な型の変数を一度に扱うときは、構造体を使う。

構造体型名を短くするため、typedef宣言と同時に使用する。

コメント