我已经查看了这段代码,我注意到这个看起来很怪异的转换
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)
我根据调用调用了演员阵容"第一"和"第二"(左边是第二个).
看起来这段代码使用了几个unsigned short ints 将指针存储在两半中。这假设 an 的unsigned short int宽度是指针的一半。该代码从两个相邻的 Shorts(即数组的第二个和第三个成员)中提取存储的指针,并将其解释为指向unsigned long long int.
因此,最终的强制转换是将整数重新解释为指针所必需的,而第一个(内部)强制转换用于从现有变量中读取不同类型的值,即从短值(或者更确切地说,从两个相邻的短值)读取长值。