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

  • 相关阅读:
    DBCO-NH2,DBCO-Amine 实验室 杂氮二苯并环辛炔-胺 1255942-06-3
    使用 BeanUtils.copyProperties属性拷贝
    阿里、滴滴、华为等一线互联网分布式消息中间件:RocketMQ核心笔记
    关于展会跟进的那些事
    Python中的Tkinter(Python的GUI编程)
    解决recovery页面反转的问题
    C++——类和对象3|日期类型|Cout运算符重载|Cin运算符重载|const成员|
    【Linux】进程间通信 -- 共享内存
    windows docker desktop配置加速地址
    自定义映射resultMap
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126088096