変数の型を変えることです。例えば、int iと定義した瞬間、iはint型になりますが、これをdouble型として扱いたい、という時があります(int型で計算を進めていくと、計算途中で小数点以下が切り捨てられるため、結果が不正確になることがある)。そんなときは、「(double)i」と、型名を括弧で括って変数の前に出すことにより、double型として扱えます。
#include <stdio.h>
int main(int argc, char* argv[]){
int i;
double d;
/* doubleによる計算 */
d = 2;
d = d / 3;
printf("%lf\n",d);
/* intによる計算 */
i = 2;
d = i / 3;
printf("%lf\n",d);
/* intのdoubleキャストによる計算 */
i = 2;
d = (double)i / 3;
printf("%lf\n",d);
return 0;
}
intの計算では2/3 = 0.666... → 0 となってしまいますが、doubleでキャストすると0.666667と表示されます。
ポインタも、同様にキャストすることができます。特に、変数を引数に入れるとき、引数として受け取った変数を使用する前などでよく使われます。
関数の引数にvoid*を使用することがあります。これは、適当なポインタを入れろ、と言う意味なので、文字どおり適当なポインタを入れればよいわけですが、その引数を関数内で使う場合は、そのままでは使用できません。そこで、ポインタのキャストを行います。
#include <stdio.h>
void func(void* t){
int *i;
/* tの(void*)→(int*)キャスト */
i = (int *)t;
printf("%d\n",*i);
}
int main(int argc, char* argv[]){
int i;
i = 2;
func(&i);
return 0;
}
結果、2が表示されます。もちろん、void*以外のポインタ型からのキャストもできます。
#include <stdio.h>
void func(char* t){
int *i;
/* tの(char*)→(int*)キャスト */
i = (int *)t;
printf("%d\n",*i);
}
int main(int argc, char* argv[]){
int i;
i = 2;
/* 代入時にキャストしないと警告が表示されます */
func((char*)&i);
return 0;
}
何が入ってくるか分からないときだけ、void*→それぞれのポインタへの変換を行うとし、絶対にint型ポインタが入ってくると分かっている場合はint型ポインタを引数でとった方がいいでしょう。