c中的双重铸造

时间:2013-12-09 00:00:58

标签: c casting

我已经过了this code,我注意到这个看起来很奇怪的演员

oldidt = (unsigned long long *)(*(unsigned long*)(oldidtr+1));  

对我来说,看起来第一个演员正在影响+1所以它将移动4个字节(一个指针),第二个演员表示结果为unsigned long long *。内部演员的外壳中的明星是“获取此记忆”的明星。

  • 是吗?
  • 为什么如果原始定义是一个指针而烦恼,我们正在转向另一个指针,+1仍将是一个4字节的跳转。
  • 如果我写oldidt = *(oldidt+1);会怎么样? (假设编译器不抱怨,并给出和执行)

oldidt的声明是:

static unsigned long long *oldidt;  

我根据调用(左边是第二个)调用强制转换“第一个”和“第二个”。

1 个答案:

答案 0 :(得分:2)

看起来这段代码使用了几个unsigned short int来将指针存储在两半中。这假设unsigned short int是指针的一半宽。代码从两个相邻的short中提取存储的指针,即数组的第二个和第三个成员,并将其解释为指向unsigned long long int的指针。

因此,最后的强制转换是将整数重新解释为指针所必需的,而第一个(内部)强制转换用于从现有变量中读取不同类型的值,即从短整数(或者更确切地说,从两个相邻)读取短裤)。