変数の型を変えることです。例えば、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型ポインタを引数でとった方がいいでしょう。