構造体とは変数の一種です。
構造体を使うと関連がある複数の変数をまとめて扱えるので、変数の管理がしやすくなる上にコードが見やすくなるメリットがあります。
構造体とは何かわかりやすく解説
構造体を使うと関連する変数をまとめて扱えます。
構造体を使わなくても変数で同じことを実現できるのですが、構造体を使った方がコードが読みやすくなるのでよく使われます。


例えば人の名前、ID、年齢を記録したい場合、変数のみを使うと以下のようになります。
例1:
#include <stdio.h>
void main()
{
int yamada_id=1, yamada_age=25;
char yamada_name[30]="Yamada Takashi";
int nakamura_id=2, nakamura_age=28;
char nakamura_name[30]="Nakamura Ai";
int sato_id=3, sato_age=30;
char sato_name[30]="Sato Jun";
}
もうすでに見にくいのに、人数が増えるとますます見にくくなります。
一方で構造体を使うと以下のように書き換えられます。

例2:
#include <stdio.h>
struct person //構造体の定義
{
int id;
char name[30];
int age;
};
void main()
{
struct person yamada={1,"Yamada Takashi", 25}; //1行が1人分の情報
struct person nakamura={2,"Nakamura Ai", 28};
struct person sato={3,"Sato Jun", 30};
}
こちらの方が行数が少なく、情報も散らばらないので見やすいですよね。
人数が増えても見やすさは保たれます。
このように関連する情報を管理するときに威力を発揮するのが構造体です。
構造体の宣言・定義方法
宣言方法
struct 構造体名
{
メンバの宣言;
};
定義方法
struct 構造体名 構造体変数名;
例として人のID、名前、年齢を保存するための構造体personを作ってみます。
例3:
struct person //構造体の宣言
{ //メンバはid、name、age
int id;
char name[30]; //ポインタで宣言も可能
int age;
};
void main()
{
struct person yamada; //構造体の定義
}
構造体の宣言は必ず構造体の定義の前に書くことに注意です。
構造体の初期化・値の代入方法
初期化・代入方法
定義時に初期化する方法:
struct 構造体名 構造体変数名={初期化リスト};
値を代入する方法(定義後に初期化する方法):
構造体変数名.メンバ名=値;
構造体変数名とメンバ名はドット演算子(.)で繋ぎます。
例4:
#include <stdio.h>
#include <string.h>
struct person
{
int id;
char first_name[30];
char *last_name; //文字列は配列とポインタどちらも使える
char sex; //1文字なら普通の文字型変数でOK(男性:M、女性F)
};
void main()
{
//定義時に初期化
struct person yamada={1, "Takashi", "Yamada", 'M'};
//定義後に初期化
struct person nakamura;
nakamura.id=1;
strcpy(nakamura.first_name,"Ai"); //配列の場合
nakamura.last_name="Nakamura"; //ポインタの場合
nakamura.sex='F';
}
文字列のメンバは配列かポインタかによって値の代入方法が異なるので注意です。
配列で定義した場合、strcpyを使って値を代入します。
strcpyを使う時は先頭に「#include <string.h>」を書くことをお忘れなく。
ポインタで定義した場合はダブルクォーテーション(")で囲った文字列をイコールで代入します。
構造体のメンバにアクセスする方法
メンバへのアクセス方法
構造体変数名.メンバ名
構造体のメンバの値をprintfで出力する際は以下のように書きます。
例5:
#include <stdio.h>
struct person
{
int id;
char first_name[30];
char *last_name;
char sex;
};
void main()
{
struct person yamada={1, "Takashi", "Yamada", 'M'};
printf("ID=%d, Name=%s %s, Sex=%c\n",yamada.id,yamada.first_name,yamada.last_name, yamada.sex);
}
実行結果
ID=1, Name=Takashi Yamada, Sex=M
構造体のポインタ
構造体ではポインタ変数を作ることができます。
構造体のポインタの使い方
定義方法:
struct 構造体名 *ポインタ名;
初期化方法:
ポインタ名=&構造体名;
メンバへのアクセス方法:
ポインタ名->メンバ名
例6:
#include <stdio.h>
struct person
{
int id;
char first_name[30];
char *last_name;
char sex;
};
void main()
{
struct person yamada={1, "Takashi", "Yamada", 'M'};
struct person *ptr=&yamada;
printf("ID=%d, Name=%s %s, Sex=%c\n",ptr->id,ptr->first_name,ptr->last_name, ptr->sex);
}
実行結果
ID=1, Name=Takashi Yamada, Sex=M
関連記事
-
-
【C/C++】typedefとは?構造体(struct)での使い方
C言語においてtypedefを使うと構造体の宣言をスマートに書くことができます。 一方、C++でもtypedefは使えますが、構造体と一緒には使わないです。 typedefとは何かわかりやすく解説 t ...
続きを見る
C言語で行き詰まったら…
-



-
C言語・C++がわからない時に質問できるサイト・サービス5選
C言語を独学で勉強しているけど内容がイマイチわからない。もはや何がわからないのかもわからない。 C++のエラーが解決できない。ググってもわからない。わかる人に解説してほしい。 こんなお悩みにお答えしま ...
続きを見る