Page 18 キャスト

キャストとは

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

戻る