C双Typecast

时间:2015-04-20 02:04:54

标签: c pointers casting

这是来自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?

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

1 个答案:

答案 0 :(得分:3)

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

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

如果项目为int,则会按int的大小前进。在当前的环境中,这可能是4或8,但希望将来会更大,所以我们可以停止搞乱bignum库: - )

如果项目类型为char,则它会前进一个(sizeof(char) 总是一,因为ISO C将字节定义为{{1}的大小而不是八位)。

因此,如果你有四字节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.