• 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");
     

  • 相关阅读:
    Linux操作系统~进程地址空间
    Java笔记-使用processBuilder调用shell(Linux)
    深入浅出 -- 系统架构之在Java体系中的微服务标准组件
    https比http安全在哪
    MongoDB基础
    对Java中的Exception(异常)机制的详细总结(大全)
    WordPress还原重置插件WP Reset 教程!
    php实现抖音小程序支付
    VMware _ Ubuntu _ root 密码是什么,怎么进入 root 账户
    淘宝扭蛋机小程序开发:开启购物新纪元,探索乐趣无穷的互动体验
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126088096