こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

struct tag{
char str[6];
}aa;

aa = *(struct tag *)"HELLO"; //5行目

printf("%s\n",aa.str);
}

上記のプログラムの5行目の仕組みはどうなってるんですか?
ここでのポインタの意味があまりよくわからないんですが、、
一番先頭の * はtag型の構造体変数aaを参照してるんでしょうか?
そして、()内の * は何を指してるんでしょうか?
いまいち理解しにくいです。どなたか解説お願いします!

 

投稿日時 - 2009-07-15 03:38:03

QNo.5126613

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2009-07-15 09:54:54

お礼

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

投稿日時 - 2009-07-16 19:09:45

ANo.2

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

投稿日時 - 2009-07-15 09:26:44

補足

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

投稿日時 - 2009-07-16 19:10:20

ANo.1

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

投稿日時 - 2009-07-15 04:08:18

お礼

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

投稿日時 - 2009-07-16 19:05:58