- ベストアンサー
C言語について
リストやスタック、キューなどのデータ構造をC言語で書くとき、構造体をほとんどのプログラムで使用されているのですが、それはなんのためなのでしょうか?それと、 -> このような記号で表された式、例えば q->head=0; という式を見たのですが、 この q->head は q > q - head という意味で捉えてはいけないのでしょうか?捉えていいのなら最後に0で初期化しているのがなぜかわかりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
他の方も言ってるので、はしょりますが^^ q->head=0; は q[0].head=0; qというポインタに、構造体内での、headの位置を加えた後 その位置ポインタの中身に対して”0”を代入。という意味です。 typedef struct { int a; int b; int c; }WAA; void hoge(void) { WAA abc[50]; WAA *p; p=&abc[20]; p->a=1; // これと、abc[20].a=1 は同じ。 p->b=2; // これと、abc[20].b=2 は同じ。 p->c=3; // これと、abc[20].c=3 は同じ。 // しかし、20番の位置を1度求めれば以後、pはずっと、abc[20]へのポインタなので高速である } ポインタを使った高速化などでは、よくこの書式を使うので、覚えておいて損はないかと。
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
そのようなものは、複数の値を一纏めで扱います。 例えば、単方向リストなら、 「要素の値」と「次の要素」の二つが一セットになってますよね? 構造体を使わない方法もありますが、大抵はそっちの方が複雑になります。 q->head は struct A *q ; /* qは struct Aへのポインタ */ のときに (*q).head; /* qが指し示すstruct Aの実体の head 要素 */ と同じになります。 「ポインタが示す構造体の実体の要素」というのはよく使われるので、-> という演算子で使えるようになっています。 > q->head は q > q - head という意味 この考えでいけば a <= b は a = a < b となりそうですが、そうはなっていませんよね? そんな分割して考えられるのは「代入演算子」と呼ばれる特別なものだけです。 (それも、「同等と考えられる」だけで、完全に同じものではありません) -> はこの2文字で1つの演算子です。 このあたり、まともな参考書にはちゃんと載っているはずなのですが。
- lv4u
- ベストアンサー率27% (1862/6715)
>>リストやスタック、キューなどのデータ構造をC言語で書くとき、構造体をほとんどのプログラムで使用されているのですが、それはなんのためなのでしょうか? そのほうが行数が少なくなるし、結果としてコードが分かりやすくなります。 >>例えば q->head=0; という式を見たのですが、 この q->head は q > q - head という意味で捉えてはいけないのでしょうか? いけません。命令の意味が変わってしまいます。 >>捉えていいのなら最後に0で初期化しているのがなぜかわかりません。 捉えてはいけません。