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?
括号内的*
是怎么回事?这是取消引用变量中的数据吗?一些解释将不胜感激。
它不是类型转换为 int
或 char
,而是将 指针 类型转换为 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
这是乔恩·埃里克森 (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?
括号内的*
是怎么回事?这是取消引用变量中的数据吗?一些解释将不胜感激。
它不是类型转换为 int
或 char
,而是将 指针 类型转换为 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