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へのポインタとなります。
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿