来自:c专家编程.P187.
强制类型转换(cast)这个术语从C语言一诞生就开始使用,即用于类型转换,也用于消除类型歧义。可以很容易地把某种类型的数据强制转换为基本类型的数据:在括号里写上新类型的名称,然后把它们放在需要转化类型的表达式的前面。在强制转换一个更为复杂的类型时,可以采取如下的方法:
1、 一个对象的声明,它的类型就是想要转换的结果类型;
2、 删去标识符以及任何类似extern之类的存储限定符,并把剩余的内容放在一对括号里面;
3、 把第二步产生的内容放在需要进行类型转换的对象的左边。
作为一个例子,程序员经常发现他们需要强制类型转换以便使用qsort()库函数。这个库函数接收4个参数,其中一个是指向比较函数的指针,qsort()函数的声明如下:
void qsort(void *buf,size_t num,size_t size,int(*comp)(const void *ele1,const void *ele2));
当调用qsort函数时,可以向它传递一个你所喜欢的比较函数。你的比较函数将接收实际的数据类型而不是void*参数,就像下面这样:
int intcompare( const int *i, const int *j )
{
return *i - *j;
}
这个函数并不与qsort()的comp()参数完全匹配,所以要进行强制类型转换。假定有一个数组a,它具有10个元素,需要对它们进行排序,根据上面列出的3个步骤,可以发现对qsort()的调用将会是下面这个样子:
qsort( a, 10, sizeof(a[0]), (int(*)(const void *, const void *))intcompare );
#include<stdio.h> #include<stdlib.h>
//对整型数进行排序 int intcompare( const int *i, const int *j ) { return *i - *j; }
//对double类型的数进行排序 int doublecompare( const double * i, const double * j ) { if( *i > *j ) return 1; else if( *i < *j ) return -1; else return 0; }
int main() { int base[]={ 3, 102, 5, -2, 98, 52, 18, 56, 38, 70 }; int i, len = sizeof(base)/sizeof(base[0]); for( i = 0; i < len; i++ ) { printf("%d, ", base[i]); } printf("/n"); qsort( base, len, sizeof(base[0]), (int(*)(const void *, const void *))intcompare ); for( i=0; i < len; i++) { printf("%d, ", base[i]); }
printf("/n/n"); double base1[]={1.2, 2.6, 3.4, 8.6, 14.3, 0.2, 7.9, 1.6, 9.2, 10.8, 5.55 }; int len1 = sizeof(base1)/sizeof(base1[0]); for( i = 0; i < len1; i++ ) { printf("%5.2f, ", base1[i]); } printf("/n"); qsort( base1, len1, sizeof(base1[0]), (int(*)(const void *, const void *))doublecompare ); for( i=0; i < len1; i++) { printf("%5.2f, ", base1[i]); }
return 0; }
|