强制类型转换相关概念

来源:互联网 发布:淘宝联系卖家客服 编辑:程序博客网 时间:2024/04/28 13:35

来自:c专家编程.P187.

强制类型转换(cast)这个术语从C语言一诞生就开始使用,即用于类型转换,也用于消除类型歧义。可以很容易地把某种类型的数据强制转换为基本类型的数据:在括号里写上新类型的名称,然后把它们放在需要转化类型的表达式的前面。在强制转换一个更为复杂的类型时,可以采取如下的方法:

1、             一个对象的声明,它的类型就是想要转换的结果类型;

2、             删去标识符以及任何类似extern之类的存储限定符,并把剩余的内容放在一对括号里面;

3、             把第二步产生的内容放在需要进行类型转换的对象的左边。

 

作为一个例子,程序员经常发现他们需要强制类型转换以便使用qsort()库函数。这个库函数接收4个参数,其中一个是指向比较函数的指针,qsort()函数的声明如下:

void qsort(void *bufsize_t numsize_t sizeint(*comp)(const void *ele1const 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;

}

 

原创粉丝点击