C 双重类型转换

C Double Typecast

这是乔恩·埃里克森 (Jon Erikson) 撰写的《剥削艺术》一书中的这段代码。我知道第二行的类型转换让编译器让你独自处理数据类型。我不确定的是为什么在底线上需​​要双重类型转换。

int *int_pointer;  
int_pointer = (int *) char_array;

for(i=0; i < 5; i++) 
    printf("[integer pointer] points to %p, which contains the char '%c'\n", int_pointer, *int_pointer);
    int_pointer = (int *) ((char *) int_pointer + 1);

我假设这是因为如果没有 (int *) 就这样保留它会使它增加正确的数据类型字符,但这不是您想要的吗?为什么要类型转换回 int?

括号内的*是怎么回事?这是取消引用变量中的数据吗?一些解释将不胜感激。

它不是类型转换为 intchar,而是将 指针 类型转换为 char 指针或 int 指针.

当您向指针添加一个时,它会根据项目的类型缩放增量,前进到指向的下一个 项目

如果项目是int,它前进一个int的大小。在当前环境中这可能是 4 或 8,但希望将来会更大,这样我们就可以停止使用 bignum 库:-)

如果项目是 char 类型,它会增加一个(sizeof(char) 总是 一个,因为 ISO C 将一个字节定义为大小char 而不是八位)。

因此,如果您有四字节 int 类型,那么推进 int 指针和 char 指针之间会有很大的区别。例如,考虑以下代码:

int *p = 0;                 // bad idea but shows the concept.
p = p + 1;                  // p is now 4.
p = (int*)(((char*)p) + 1)  // p is now 5.

最后一条语句分解为:

(char*)p - get a char pointer version of p (a)
a + 1    - add one to it (b)
(int*)b  - cast it back to an int pointer (c)
p = c    - replace p with that value