我已经过了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;
我根据调用将转换称为“第一”和“第二”(左边是第二个)。
最佳答案
看起来这段代码使用了几个 unsigned short int
来将指针分成两半。这假设 unsigned short int
的宽度是指针的一半。该代码从两个相邻的 short 中提取存储的指针,即数组的第二个和第三个成员,并将其解释为指向 unsigned long long int
的指针。
因此,最后一次转换对于将整数重新解释为指针是必要的,而第一个(内部)转换用于从现有变量读取不同类型的值,即从短(或者更确切地说,从两个相邻的)短裤)。
关于c - c中的双重类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20460872/