|
>疑問1
>int a,b;
>(double)(a+b)/2;
>このような場合にキャストは確かに便利だと思うのですが、なんとなく
>プログラムのような厳密な世界には不適切な気がします。
>double a,b;とすれば良いだけなのにどうしてキャストという逃げ道(?)が用意されているのですか?
本質的に異なるものの橋渡しをするためです。
例えば,あるテストの平均点を出すとします。すると,
・個々の得点は整数
・合計点も整数
・平均点は小数
となります。
#中には得点が小数のテストもあるでしょうけど,それは考えない。
ここで,合計点から平均点を出すときに,
明示的にしろ暗黙的にしろ,キャストが必要になります。
>疑問2
>void * というどんな型のポインタでも入れることが出来るものがあるそうですが、これもその後に何らかの処理をするために別の型にキャストする必要があることがしばしばあると思います。
>なのにどうしてvoid *なるものが存在するのですか?
void *は「型が不明のオブジェクトへのポインタ」とか,
「記憶域の塊」を表すのに利用します。
例えば,malloc関数が
char * malloc (size_t);
のように宣言されていたり,memcpy関数が
char * memcpy (char *, const char *, size_t);
のように宣言されていると,関数を使うたびに引数や戻り値でキャストを必要とします。
>疑問3
>int型からdouble型へはキャストできますが、構造体A型を指すポインタから構造体B型を指すポインタへはキャストできないと思います。
できますよ。
>そうだとすると、何型から何型へキャストできるのでしょうか?
>キャストできる型とは何なのでしょうか?
変換が存在する型同士でキャストができます。
1. cv修飾子を除いた部分が同じ型同士
2. 算術型同士
3. 任意の型からvoid型へ
4. 整数型とポインタ型
5. オブジェクト型または不完全型へのポインタ型からオブジェクト型または不完全型へのポインタ型
6. 関数へのポインタ型から関数へのポインタ型
C言語のキャストには,3つの意味があります。
a. cv修飾の変更 (1)
b. 値の変換 (2, 3)
c. ポインタが指すオブジェクトの型の変更 (4, 5, 6)
たいていの場合,特にaとcは使わなくても済むのですが,
システムの都合上使わざるを得ない場合があります。
#Windowsのメッセージなんか酷い状況です。
|