C++データ構造:配列、構造体、ポインタで効率的なプログラムを構築
C/C++の配列を使用すると、同じ種類のデータ項目をいくつか組み合わせた変数を定義できますが、構造体 は異なる種類のデータ項目を組み合わせることができる、別のユーザー定義データ型です。
構造体はレコードを表現するために使用されます。例えば、図書館の本を管理したいとします。各本について以下の属性を追跡したいかもしれません:
- タイトル
- 著者
- 主題
- 書籍ID
構造体の定義
構造体を定義するには、struct 文を使用する必要があります。struct 文は、複数のメンバを持つ新しいデータ型をプログラムに定義します。struct 文の形式は以下の通りです:
struct [structure tag] {
member definition;
member definition;
...
member definition;
} [one or more structure variables];
構造体タグ は省略可能で、各メンバ定義は通常の変数定義(int i; や float f; など、有効な変数定義)です。構造体定義の末尾、最後のセミコロンの前に、1つ以上の構造体変数を指定できますが、これは省略可能です。Book 構造体の宣言方法:
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
構造体メンバへのアクセス
構造体の任意のメンバにアクセスするには、メンバアクセス演算子 (.) を使用します。メンバアクセス演算子は、構造体変数名とアクセスしたい構造体メンバの間にピリオドを置いて記述します。struct キーワードを使って構造体型の変数を定義します。構造体の使用例:
Live Demo#include <iostream>
#include <cstring>
using namespace std;
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1; // Book1をBook型で宣言
struct Books Book2; // Book2をBook型で宣言
// 書籍1の仕様
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// 書籍2の仕様
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 書籍1の情報出力
cout << "Book 1 title : " << Book1.title << endl;
cout << "Book 1 author : " << Book1.author << endl;
cout << "Book 1 subject : " << Book1.subject << endl;
cout << "Book 1 id : " << Book1.book_id << endl;
// 書籍2の情報出力
cout << "Book 2 title : " << Book2.title << endl;
cout << "Book 2 author : " << Book2.author << endl;
cout << "Book 2 subject : " << Book2.subject << endl;
cout << "Book 2 id : " << Book2.book_id << endl;
return 0;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Book 1 title : Learn C++ Programming Book 1 author : Chand Miyan Book 1 subject : C++ Programming Book 1 id : 6495407 Book 2 title : Telecom Billing Book 2 author : Yakit Singha Book 2 subject : Telecom Book 2 id : 6495700
構造体を関数引数として渡す
構造体を関数引数として渡すのは、他の変数やポインタを渡すのと非常に似ています。構造体変数へのアクセスは上記例と同様に行います:
Live Demo#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books book );
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1;
struct Books Book2;
// 書籍1の仕様
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// 書籍2の仕様
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 書籍1の情報出力
printBook( Book1 );
// 書籍2の情報出力
printBook( Book2 );
return 0;
}
void printBook( struct Books book ) {
cout << "Book title : " << book.title << endl;
cout << "Book author : " << book.author << endl;
cout << "Book subject : " << book.subject << endl;
cout << "Book id : " << book.book_id << endl;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Book title : Learn C++ Programming Book author : Chand Miyan Book subject : C++ Programming Book id : 6495407 Book title : Telecom Billing Book author : Yakit Singha Book subject : Telecom Book id : 6495700
構造体へのポインタ
構造体へのポインタは、他の変数へのポインタを定義するのと非常に似た方法で定義できます:
struct Books *struct_pointer;
これで、上記で定義したポインタ変数に構造体変数のアドレスを格納できます。構造体変数のアドレスを取得するには、構造体名の前に & 演算子を置きます:
struct_pointer = &Book1;
その構造体へのポインタを使って構造体のメンバにアクセスするには、-> 演算子を使用します:
struct_pointer->title;
上記例を構造体ポインタを使って書き直してみましょう:
Live Demo#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books *book );
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1;
struct Books Book2;
// 書籍1の仕様
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// 書籍2の仕様
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// 書籍1の情報出力、構造体のアドレスを渡す
printBook( &Book1 );
// 書籍2の情報出力、構造体のアドレスを渡す
printBook( &Book2 );
return 0;
}
// この関数は構造体へのポインタをパラメータとして受け取る
void printBook( struct Books *book ) {
cout << "Book title : " << book->title << endl;
cout << "Book author : " << book->author << endl;
cout << "Book subject : " << book->subject << endl;
cout << "Book id : " << book->book_id << endl;
}
上記コードをコンパイルして実行すると、以下の結果が得られます:
Book title : Learn C++ Programming Book author : Chand Miyan Book subject : C++ Programming Book id : 6495407 Book title : Telecom Billing Book author : Yakit Singha Book subject : Telecom Book id : 6495700
typedef キーワード
構造体を定義するより簡単な方法、または作成した型に「エイリアス」を付ける方法があります。例:
typedef struct {
char title[50];
char author[50];
char subject[100];
int book_id;
} Books;
これで、struct キーワードを使わずに Books を直接使用して Books 型の変数を定義できます。例:
Books Book1, Book2;
typedef キーワードは非構造体型にも使用できます:
typedef long int *pint32; pint32 x, y, z;
x、y、z はすべて long int へのポインタです。
C言語
- 次世代磁気ナノ構造「透明マント」でデータストレージを革新
- C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C言語構造体:複雑なデータを効率的に整理
- C言語typedef:カスタム型名でコードをシンプルに
- C++データ構造:配列、構造体、ポインタで効率的なプログラムを構築
- C++データ抽象化完全マスター:インターフェースと実装の分離
- C++データカプセル化:コードを守る仕組みと実装例
- Javaデータ構造: 従来クラス(Vector/Stack/Hashtable等)とコレクションフレームワーク概要