• C专家编程 第8章 为什么程序员无法分清万圣节和圣诞节 8.9 如何进行强制类型转换,为何要进行类型强制转换


    如何进行强制类型转换,为何要进行类型强制转换
    “强制类型转换”(cast)这个术语从C语言一诞生就开始使用,既用于“类型转换”,也用于“消除类型歧义”。
    (float)3
    它就是一个类型转换,而且数据的实际二进制位发生了改变。如果这样写:
    (float)3.0
    它就用于消除歧义,这样编译器可以从一开始就选用正确的位模式。有些人认为它之所以命名为强制类型转换,是因为它们可以把有些东西变得不完整。
    你可以很容易地把某种类型的数据强制转换成基本类型的数据:在括号里写上新类型的名称(如int),然后把它们放在需要转换类型的表达式前面。在强制转换一个更为复杂的类型时,转换的方法并不是那么显而易见。
    复杂的类型转换可以按以下3个步骤编写。
    1.查看一个对象的声明,它的类型就是想要转换的结果类型。
    2.删去标识符(以及任何如extern之类的存储限定符),并把剩余的内容放在一对括号里。
    3.把第2步产生的内容放在需要进行类型转换的对象的左边。
    作为一个例子,程序员经常发现它们需要强制类型转换以便使用qsort()库函数。这个库函数接收4个参数,其中一个是指向比较函数的指针。qsort()函数声明如下:
    void qsort(void base, size_t nel, size_t width, int (*compar)(const void *, const void *));
    当调用qsort()函数时,可以向它传递一个你喜欢的比较函数。你的比较函数将接受实际的实际数据类型而不是void*参数,就像下面这样:
    int intcompare(const int *i, const int *j) {
        return (*i - *j);

    这个函数并不与qsort()的compar()参数完全匹配,所以需要进行强制类型转换。我们假定有一个整数数组,它具有10个元素,现在需要对它们进行排序。根据上面列出的3个步骤,我们可以对qsort()的调用将会是下面这种样子:
    qsort(a,
          10,
          sizeof(int),
          (int (*)(const void *, const void *))intcompare
          );
    作为一个不实用的例子,你可以建立一个指向如printf()之类的函数的指针,使用
    extern int printf(const char *, ...);
    void *f = (void*)printf;
    这样你就可以通过一个适当类型转换来调用printf()函数了,方法如下:
    (*(int(*)(const char *, ...))f)("Bite my shorts. Also my chars and ints\n");
     

  • 相关阅读:
    差点被这波Handler 面试连环炮带走~
    RabbitMQ之延迟队列
    C++初识内存管理和模版
    跨行新手学习并备考阿里云云计算专业认证ACP大概需要多长时间呢?
    unity中绑定动画的行为系统
    代码随想录48——动态规划:198打家劫舍、213打家劫舍II、337打家劫舍III
    redis缓存数据和表数据一致性之延时双删策略
    public protected private继承
    计算机软考高项(信息系统项目管理师)、中项(系统集成项目管理工程师),统计师中级的一些备考经验
    Docker基础命令、镜像相关命令
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126088096