- 締切済み
構造体 プログラム解説 C言語
struct tag{ char str[6]; }aa; aa = *(struct tag *)"HELLO"; //5行目 printf("%s\n",aa.str); } 上記のプログラムの5行目の仕組みはどうなってるんですか? ここでのポインタの意味があまりよくわからないんですが、、 一番先頭の * はtag型の構造体変数aaを参照してるんでしょうか? そして、()内の * は何を指してるんでしょうか? いまいち理解しにくいです。どなたか解説お願いします!
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- php504
- ベストアンサー率42% (926/2160)
(型名 *)はポインタ型のキャストですね この場合は char*からstruct tag*への変換になっています。 void*以外とのポインタ型変換は普通はあまり使いません 使うとトリッキーでわかりにくいプログラムになりますね
- titokani
- ベストアンサー率19% (341/1726)
ほめられたプログラムじゃないですね。 strcpy(aa.str,"HELLO"); とするのが普通でしょう。 もしくは、 const static struct tag AA={"HELLO"}; aa=AA; とかですかね。
補足
そうですよね。なんか参考書に、こういうやり方もある。的な感じで書かれてましたけどちょっと異質なやり方ですよね。 わかりにくいですしね(・ω・`)
- uninin
- ベストアンサー率20% (26/129)
やってることは memcpy(aa, "HELLO", 5) と同じです。 構造体の代入をするとメモリの内容がまるごとコピーされるんですが、この場合は文字列 "HELLO" を構造体 tag に見せかけて構造体として扱えるようにしています。以下の様になりますね。 "HELLO" 文字列(を指すポインタ) (struct tag *)"HELLO" 構造体のポインタ *(struct tag *)"HELLO" 構造体のポインタの指す中身
お礼
そういうことだったんですか!ありがとうございます。。
お礼
なるほど!キャストで型変換を行っていたわけですね。 てことは、普通に(struct tag)じゃだめなんですかね??