• ベストアンサー

構造体にする理由・利点・使用例

最近「構造体」についての学習が始まりました。テキストなどで構造体を使用したプログラム例がいくつか載っていますが、あくまで説明にとどめているので、一見見ると返って複雑になってどんなメリットがあるのかいまいちつかめません。 構造体のメリットって何でしょうか?  規模の大きいプログラムになると構造体が不可欠といわれるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jack-a3
  • ベストアンサー率38% (305/800)
回答No.3

構造体とはいろいろな型のデータの固まりに名前を付けて管理し、扱えるようにしたものです。これはとっても便利です。 ・データを一まとめにして構造体の配列で定義し使用できる。 int a[50], b[50], c[50]; char d[50]; と定義するのでなく、 struct { int a,b,c; char d;} Data[50]; とした方が分かりやすいです。 ・上記データを別関数に引数で渡す時、 func(&a[n],&b[n],&c[n],&d[n]) とするのではなく、func(&Data[n])と書ける。 これは重要です。 もし後日メンバとしてlong eを追加することになった場合、前者では関数の引数を(渡す方も受ける方も)直す必要がありますが、 後者ではstruct Dataの定義を変えるだけで済みます。 直す場所が少なくて済むということは、直した後に確認する量や時間も少なくて済むということです。 他にも移植性を高めるためだとか、コンパイラに最適化を行わせる時の判断に使えるだとか、 外部から受信したデータをあるフォーマットに従って解釈するために使うとか、いろいろと使い道があります。

nVIDIA
質問者

お礼

一つのプロトタイプが完成したとして、新たに何らかの変更で変数を追加・変更する事となったら大変な作業となりますよね。 それを、あらかじめ一つにまとめておけばそこだけ書き換えるだけでいいですものね。 構造体が便利であるという理由が見えてきました。 どうもご回答ありがとうございます。

その他の回答 (5)

回答No.6

C言語の標準ライブラリでよく知られた構造体として、 struct tm というのがあります。 その例は、 http://www1.cts.ne.jp/~clab/hsample/Time/Time4.html にあります。 これは、C言語の標準ライブラリで、日時を扱う関数が共通して使う構造です。日時を扱う関数がすべてこのような形のデータを使うので、 ・日時を使うための新しい関数が必要 ・実際に日時の計算をしたい ・面倒な日時の計算をするために既存の関数を使う 等の場合、この構造体をベースにするとうまくいく可能性が高いわけです。 ここまで有名でなくても、自分たちのプログラムの中で、関係のあるものをひとつの構造体として定義しておくと、それに関連する関数の流通性が良くなります。 他にも、リンクドリストのようにデータを動的に(実行時に数を増やしたり減らしたりする)管理する場合、ポインタとデータのペアがどうしても必要になります。 このような場合にも、ポインタとデータ(が、また構造体だったりもしますが)のペアを構造体として定義します。 struct linkType { int data; struct linkTpye *next; }; のように。 もうひとつ、構造体は直接代入が可能です。 このため、 struct{ char address[50]; char name[50]; int age; } personA, personB; などという構造体で、 personA = personB; という代入は有効です。 おまけとして、これを使うと、 struct charArray { char [128]; }; struct charArray a; struct charArray b; で、 b = a; などと、配列の代入が出来てしまいます。 (が、この機能を使うと、おそらく他の人の迷惑になるでしょう。一見しただけでは意図がわからないから)

nVIDIA
質問者

お礼

あくまで例ですから。 先生からも他人から見てもわかりやすいように書くよう指示されてますのであしからず。 利点や重要さが見えてきた気がします。後は経験しだいですね。今後、また構造体のほかにも壁にぶつかるかもしれませんが、その時は相談をおねがいします。 今回はありがとうございました。

  • PG_RankB
  • ベストアンサー率40% (12/30)
回答No.5

もう的確なお答えが出ているので、今更言う事は無いのですが。。。 少し質問から離れてしまいますが、お許し下さい。 プログラムの規模は、学校での勉強の時は、数十から始まり、main()の中だけで済む事も大半です。 課題が出ても、数百ステップですね。 そこで、グローバル変数では無くローカル変数。 関数で処理を小分けにする。構造体や配列でデータをまとめる。 と言われても、正直な所、メリットが感じられないのは事実だと思います。 私も今まで、ポインタ、構造体、関数。どれもこれも、新しい機能を学び始めの頃は、過去のソース、知識と見比べ、今のままで絶対に、充分だ。と思っていました。 ですが、これらの機能は、過去の偉大な方々が、必要だからこそ入れた機能で、大抵重要な意味を持っています。 プログラムの規模が大きくなれば、データをまとめるために構造体を使用する場面は増えてきます。 それは、実際に経験して肌で感じた時に、否応なしに理解する物ですので、必要ない。とないがしろにはしないでいた方が、後々のためだと思いますよ^^ 機能の真意が理解できた時、ニヤッとしますからw プロの現場では、常に数十万~数百万ステップ規模のソースの隣にいなければならなくなります。 構造体や関数、ポインタなどの機能は、単純にソースコードを短く簡潔にしてくれる作用も持っています。 場合によっては、ソースを何十分の1の大きさにする事も充分あり得ます。 jack-a3様の言うとおり、構造体のメンバに追加した時、関数のインタフェース(引数・戻り値の型や個数の事)を変更せずに済むのも大きなメリットです。 関数に引数1つ追加しただけで、数百回と別の場所で呼び出ししている所も全て変更。なんて、毎回やってたらそれだけで嫌になります。 巨大な規模のソースにのみ便利。と言う単純な話では無いのですが、今はまだ、その位の認識で良いかも知れませんね^^ 長文で申し訳無いですが、頑張ってください。

nVIDIA
質問者

お礼

ふむふむ、昔のおじさんたちは必要だから、このような機能を開発したのですよね。必要なきゃ学校じゃ習わないもの。こういうのは幼い子でもわかります。 >機能の真意が理解できた時、ニヤッとしますからw まさにそうです。なにか、私をどこかで見ている感じです(笑) どっちにしろ、避ける気はしませんので、絶対にマスターします。 そして「サーティファイC言語プロガラミング1級」を目指したいです。 どうも、いいお話ありがとうございます。

noname#21649
noname#21649
回答No.4

FOTRONなのでCとは多少異なるかもしれません。 複数人でソフトを作るときに変数の独立性を確保する必要があるのです。 それで「Aはoooooooを作る。大域変数としてZOで始まる変数を自由に使える。」「Bはppppppppを作る。大域変数としてZPで始まる変数を自由に使える。」と作る人によって資源(使用可能変数名・定数名等)をうまく割り振らないと.資源の奪い合いでめちゃくちゃになるのです。 大域変数でこのように割り振って.今度は.局所変数では大域変数のコピーを作るのが面倒ですから.大域変数名がそのまま生きているのです。 メモリーが比較的低価格になってきた1980年だ言い工に.かっての「メモリーを使わないプログラミング」から.「複数人間で作業を分割してお互いにわかりやすい名称にしよう」という流れに代わりました。その一環です。

nVIDIA
質問者

お礼

ソフトウェアの開発はチームで作ると最初からいわれていました。他人がそれぞれ担当したプログラムをどう一つにするのか疑問でしたが、この話からすると、どのように一つにするのか見えてくるような気がしました。 構造体の重要点はこのようなところもあるようですね。 どうもありがとうございました。

  • goma_2000
  • ベストアンサー率48% (62/129)
回答No.2

関数の引数を10個も書くの嫌でしょう。戻り値も同じだと、合わせて20個。腕が釣ったりして・・・ 構造体なら2変数ですみます。 プログラミングの基本として、関連のあるものをまとめるという事があります。その意味で、変数を管理する際に、構造体にまとめるというのは、規模が大きくなればなるほど重要ですね。混乱しないから。ってC++ならクラスを使いますけど。。。

nVIDIA
質問者

お礼

つい先日オセロゲームをつくりました。 そのときにたくさんの変数と関数を使ったからそれから考えると分かる気もします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>構造体のメリットって何でしょうか? 関連のあるデータをまとめて扱えること 規模が大きくても使わない場合もあろうかと思いますので、 直接はプログラムの規模とは関係ないと思います。

関連するQ&A