1-20. 構造体
公開日: 20:09 1. 基本編/1-20. 構造体
C/C++の配列は同じ種類の複数のデータを組み合わせた変数を定義できますが、構造体は異なる種類のデータを組み合わせてることができるもう一つのユーザ定義データ型です。
構造体は記録を表現するのに使われ、仮に図書館で書籍を探したいとします。各書籍の次の属性を見たくなるでしょう。
- Title
- Author
- Subject
- Book ID
構造体の定義
構造体を定義するためには、struct構文を使う必要があります。struct構文は新しいデータ型を定義し、1つ以上のメンバを持ちます。struct構文のフォーマットは次の ようになります。struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];structure tagはオプションであり、各メンバはint i;やfloat f;などのような通常の変数定義です。構造体の定義の最後の最後のセミコロン(;)の前には1つ以上の構造体変数を指定できますが、オプションです。本の構造体を宣言してみます。
struct Books { char title[50]; char author[50]; char subject[100]; int book_id; }book;
構造体メンバへのアクセス
構造体のメンバへアクセスするためには、メンバアクセス演算子(.)を使います。メンバアクセス演算子は構造体変数名とアクセスしたい構造体のメンバの間にピリオドで記述されます。構造体の型を定義するにはstructキーワードを使います。以下は構造体の使い方を説明するサンプルです。#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; // Book型変数Book1の宣言 struct Books Book2; // Book型変数Book1の宣言 // book1の仕様 strcpy( Book1.title, "Learn C++ Programming"); strcpy( Book1.author, "Chand Miyan"); strcpy( Book1.subject, "C++ Programming"); Book1.book_id = 6495407; // book2の仕様 strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Yakit Singha"); strcpy( Book2.subject, "Telecom"); Book2.book_id = 6495700; // Book1の情報を出力 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; // Book2の情報を出力 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
関数の引数としての構造体
構造体は変数やポインタと同じように関数の引数に渡すことができます。上の例と同様に構造体変数にアクセスすることが可能です。#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; // Book型変数Book1の宣言 struct Books Book2; // Book型変数Book2の宣言 // book1の仕様 strcpy( Book1.title, "Learn C++ Programming"); strcpy( Book1.author, "Chand Miyan"); strcpy( Book1.subject, "C++ Programming"); Book1.book_id = 6495407; // book2の仕様 strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Yakit Singha"); strcpy( Book2.subject, "Telecom"); Book2.book_id = 6495700; // Book1の情報を出力 printBook( Book1 ); // Book2の情報を出力 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;このように定義した変数に構造体変数のアドレスを保存することができるようになります。構造体変数のアドレスを使うには、次のように変数名の前に&演算子を使います。
strcut_pointer = &Book1;ポインタを使って構造体のメンバへアクセスするには、次のように->オペレータを使う必要があります。
struct_pointer->title;上の例を構造体ポインタを使って書きなおしてみます。
#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; // Book型変数Book1の宣言 struct Books Book2; // Book型変数Book2の宣言 // Book1の仕様 strcpy( Book1.title, "Learn C++ Programming"); strcpy( Book1.author, "Chand Miyan"); strcpy( Book1.subject, "C++ Programming"); Book1.book_id = 6495407; // Book2の仕様 strcpy( Book2.title, "Telecom Billing"); strcpy( Book2.author, "Yakit Singha"); strcpy( Book2.subject, "Telecom"); Book2.book_id = 6495700; // 構造体のアドレスを渡してBook1を出力 printBook( &Book1 ); // 同様にBook2を出力 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キーワードを使わずに直接Book型の変数を定義できるようになります。以下はサンプルです。
Books Book1, Book2;
次のように非構造体にもtypedefキーワードを使うことができます。
typedef long int *pint32; pint32 x, y, z;x、y、zはlong intへのポインタとなります。
0 件のコメント :
コメントを投稿