• 締切済み

構造体 プログラム解説 C言語

struct tag{ char str[6]; }aa; aa = *(struct tag *)"HELLO"; //5行目 printf("%s\n",aa.str); } 上記のプログラムの5行目の仕組みはどうなってるんですか? ここでのポインタの意味があまりよくわからないんですが、、 一番先頭の * はtag型の構造体変数aaを参照してるんでしょうか? そして、()内の * は何を指してるんでしょうか? いまいち理解しにくいです。どなたか解説お願いします!  

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

(型名 *)はポインタ型のキャストですね この場合は char*からstruct tag*への変換になっています。 void*以外とのポインタ型変換は普通はあまり使いません 使うとトリッキーでわかりにくいプログラムになりますね

tomato1414
質問者

お礼

なるほど!キャストで型変換を行っていたわけですね。 てことは、普通に(struct tag)じゃだめなんですかね??

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

ほめられたプログラムじゃないですね。 strcpy(aa.str,"HELLO"); とするのが普通でしょう。 もしくは、 const static struct tag AA={"HELLO"}; aa=AA; とかですかね。

tomato1414
質問者

補足

そうですよね。なんか参考書に、こういうやり方もある。的な感じで書かれてましたけどちょっと異質なやり方ですよね。 わかりにくいですしね(・ω・`)

  • uninin
  • ベストアンサー率20% (26/129)
回答No.1

やってることは memcpy(aa, "HELLO", 5) と同じです。 構造体の代入をするとメモリの内容がまるごとコピーされるんですが、この場合は文字列 "HELLO" を構造体 tag に見せかけて構造体として扱えるようにしています。以下の様になりますね。 "HELLO" 文字列(を指すポインタ) (struct tag *)"HELLO" 構造体のポインタ *(struct tag *)"HELLO" 構造体のポインタの指す中身

tomato1414
質問者

お礼

そういうことだったんですか!ありがとうございます。。

関連するQ&A