PR

【C・C++】構造体とは?【宣言・代入・参照方法】

アイキャッチ C++
この記事は約8分で読めます。

構造体に関する記事です。
ポインタを使った参照方法などについても解説しています。

のんびり丸

WEBアプリの開発等をしています。
日々の学習の備忘録として運営していこうと思います。

のんびり丸をフォローする

構造体とは?

構造体とは、複数の型の変数をひとまとめにしたものです。
似たようなものに配列がありますが、あちらは同じ型の変数をひとまとめにしたものです。


また、構造体の要素をメンバ【メンバ変数】と言います。

構造体の宣言

構造体を利用する場合は、以下の二つの工程が必要です。

  • 構造体テンプレートの宣言
  • 構造体変数の宣言

構造体テンプレートの宣言

まず最初に、構造体の構成要素を決定していきます。
これを構造体テンプレートの宣言と言います。

自分で新しいデータ型を作成するイメージです。
試しに、果物の構造体を作ってみます。

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

似ている機能

共用体

クラス

タイトルとURLをコピーしました