構造体に関する記事です。
ポインタを使った参照方法などについても解説しています。
構造体とは?
構造体とは、複数の型の変数をひとまとめにしたものです。
似たようなものに配列がありますが、あちらは同じ型の変数をひとまとめにしたものです。
また、構造体の要素をメンバ【メンバ変数】と言います。
構造体の宣言
構造体を利用する場合は、以下の二つの工程が必要です。
- 構造体テンプレートの宣言
- 構造体変数の宣言
構造体テンプレートの宣言
まず最初に、構造体の構成要素を決定していきます。
これを構造体テンプレートの宣言と言います。
自分で新しいデータ型を作成するイメージです。
試しに、果物の構造体を作ってみます。
struct 構造体テンプレート {
メンバ変数①;
メンバ変数②;
・・・
};
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
構造体変数の宣言
構造体テンプレートの宣言後、実際に構造体を使う場合は、構造体変数の宣言をします。
設計図から実物を作成するイメージです。
構造体テンプレート 構造体変数;
// 構造体変数の宣言
struct fruit banana;
fruit apple; // structの省略
【struct】は、省略して記述することも可能です。
テンプレートと変数の同時宣言
構造体テンプレートの宣言と、構造体変数の宣言は同時に行うことが出来ます。
struct 構造体テンプレート {
メンバ変数①;
メンバ変数②;
・・・
} 構造体変数;
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
} apple; // 変数の宣言
構造体の利用
構造体の初期化は、{}を利用して記述します。
また、構造体のメンバ変数にアクセスする場合は、【構造体変数名.メンバ名】と入力します。
コーディング例①
#include <stdio.h> // printf()を使用するために必要
/***********************
構造体テンプレートの宣言
***********************/
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
/***********************
構造体変数の初期化
***********************/
struct fruit banana = { "banana", 100, 4 };
fruit apple = { "apple", 150, 1 };
int main()
{
printf("%s %d %d\n", banana.name, banana.price, banana.num);
printf("%s %d %d\n", apple.name, apple.price, apple.num);
return 0;
}
出力
banana 100 4
apple 150 1
ポインタの利用
構造体変数も、通常の変数と同様にポインタで指し示すことが出来ます。
構造体テンプレートをデータ型のようにイメージすると分かりやすいかと思います。
ポインタを使って構造体のメンバ変数を参照する場合は、【ポインタ名->メンバ名】と入力します。
ちなみに、【->】はアロー演算子と言います。
矢のような形をしているので、アローです。
コーディング例①
#include <stdio.h> // printf()を使用するために必要
/***********************
構造体テンプレートの宣言
***********************/
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
/***********************
構造体変数の初期化
***********************/
struct fruit banana = {"banana", 100, 4};
struct fruit* pbanana = &banana; // 構造体のポインタ
int main()
{
printf("%s %d %d\n", banana.name, banana.price, banana.num);
printf("%x\n", pbanana);
printf("%s %d %d\n", pbanana->name, pbanana->price, pbanana->num);
return 0;
}
出力
banana 100 4
d532c068
banana 100 4
アドレスは、個人のPC環境によって違う値が表示されます。
構造体配列
構造体も変数と同様に、配列として利用することが可能です。
/***********************
構造体テンプレートの宣言
***********************/
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
/***********************
構造体配列の初期化
***********************/
struct fruit fruit_list[3] = {
{"apple", 150, 1},
{"banana", 100, 4},
{"orange", 200, 5}
};
配列に関しては、上記の記事でまとめています。
構造体配列の参照
コーディング例①
[]を使った参照方法です。
#include <stdio.h> // printf()を使用するために必要
/***********************
構造体テンプレートの宣言
***********************/
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
/***********************
構造体変数の初期化
***********************/
struct fruit fruit_list[3] = {
{"apple", 150, 1},
{"banana", 100, 4},
{"orange", 200, 5}
};
int main()
{
for (int i = 0; i < 3; ++i) {
printf("%s %d %d\n",
fruit_list[i].name, fruit_list[i].price, fruit_list[i].num);
}
return 0;
}
出力
apple 150 1
banana 100 4
orange 200 5
コーディング例②
【*】を使った参照方法です。
#include <stdio.h> // printf()を使用するために必要
/***********************
構造体テンプレートの宣言
***********************/
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
/***********************
構造体変数の初期化
***********************/
struct fruit fruit_list[3] = {
{"apple", 150, 1},
{"banana", 100, 4},
{"orange", 200, 5}
};
int main()
{
struct fruit* pfl = fruit_list;
for (int i = 0; i < 3; ++i) {
printf("%s %d %d\n",
(*(pfl + i)).name, (*(pfl + i)).price, (*(pfl + i)).num);
}
return 0;
}
出力
apple 150 1
banana 100 4
orange 200 5
コーディング例③
【->】アロー演算子を使った参照方法です。
#include <stdio.h> // printf()を使用するために必要
/***********************
構造体テンプレートの宣言
***********************/
//フルーツ構造体
struct fruit {
char name[10]; // 名前
int price; // 値段
int num; // 数
};
/***********************
構造体変数の初期化
***********************/
struct fruit fruit_list[3] = {
{"apple", 150, 1},
{"banana", 100, 4},
{"orange", 200, 5}
};
int main()
{
struct fruit* pfl = fruit_list;
for (int i = 0; i < 3; ++i) {
printf("%s %d %d\n",
(pfl+i)->name, (pfl + i)->price, (pfl + i)->num);
}
return 0;
}
出力
apple 150 1
banana 100 4
orange 200 5