这是来自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?
括号内的*
是怎么回事?这是否取消引用变量中的数据?一些解释将不胜感激。
答案 0 :(得分:3)
它不是int
或char
的类型转换,而是将指针转换为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.