c中的双重铸造

Ram*_*hil 6 c casting

我已经查看了这段代码,我注意到这个看起来很怪异的转换

oldidt = (unsigned long long *)(*(unsigned long*)(oldidtr+1));  
Run Code Online (Sandbox Code Playgroud)

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

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

宣言oldidt是:

static unsigned long long *oldidt;  
Run Code Online (Sandbox Code Playgroud)

我根据调用调用了演员阵容"第一"和"第二"(左边是第二个).

Ker*_* SB 3

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

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