C言語入門(19) ありがたい構造体!!理解しやすくするために大活躍

Posted: 2012年12月20日

構造体(struct)は、今まで紹介していませんので
何なのかはさっぱりだと思います。

構造体は、変数をグルーピングすることができます。
グルーピングすることで何が良くなるのか

トランプを例に違いを見てみると

 //通常
 int nNumber;
 int nSuite;

 //構造体
 struct SCard_ {
  int nNumber;
  int nSuite;
 };

これだけでは、違いはわかりません
2枚のトランプを保持する場合

 //通常
 int nCard01Number;
 int nCard01Suite;
 int nCard02Number;
 int nCard02Suite;

 //構造体
 struct SCard_ {
  int nNumber;
  int nSuite;
 };
 struct SCard_ sCard01;
 struct SCard_ sCard02;

通常の場合では、変数の数が増えるため
 誤って使用する場合があります。
今回は、変数が2つですが多数存在する場合は、
管理が大変になります。
もちろん変数名の付け方も・・・

データのコピーに対しても構造体のほうが、簡単です

 struct SCard_ {
  int nNumber;
  int nSuite;
 };
 struct SCard_ sCard01;
 struct SCard_ sCard02;
 sCard01 = sCard02;

このように=で代入ができるため
内部で複数の変数を定義していてもシンプルに実装が可能になります。

ほかにも、関数の引数に入れるときにも活躍します。

 //通常
 void GetCard(int *pNumber, int *pSuite);

 //構造体
 void GetCard(struct SCard_ *pCard);

引数が少なくなり且つ、この例の場合は、関数の意味がわかりやすくなっています。

構造体の変数を定義するためには、structをつける必要があり
大変面倒ですが

typedef

を用いることでその問題も解消できます。

 typedef struct SCard_ {
  int nNumber;
  int nSuite;
 } SCard;
 SCard sCard01;
 SCard sCard02;
 sCard01 = sCard02;

typedefで割りつけたSCardを用いて変数宣言が可能になります。
また、「SCard_」は省略可能です。

関数の引数に構造体を渡す場合の注意

構造体は、=で代入が可能なため
引数にポインターではなく実体を渡すことが可能です。
実体を渡すことで関数を呼ぶ際に構造体のコピーが実行されます。
構造体のサイズが大きい場合は、関数を呼び出す処理に時間がかかっていまいます。
なるべくポインターで渡したほうがいいと思います。
変更してほしくない場合は constなどを付加することで可能でし
どうしてもという場合ではない限りやめたほうがいいと思います。

構造体は、クラスとどのように違うのか

クラスとは、オブジェクト指向プログラムで使用される概念であり
ざっくり言いますとクラスは、処理(関数)とデータ(変数)をまとめたもの

違うところは、
構造体は、処理を入れることができない点

C言語以外の言語の場合は、
構造体でも処理をまとめられるため
その場合は、
主にデータの集まりが構造体
それ以外がクラス
のような使い分けになると思います。
ほとんど、構造体は使わなくなると思いますが・・・

練習練習:

  1. ほかにどのようなデータがまとめられるか考えてください。
     例)プロフィール、パソコンの機能仕様等
カテゴリー: プログラム, 入門 | タグ: , | コメント無し »

コメント