当类型在这里和那里多次转换时,C 类型产生疑问

C type casting doubts when type are converted many times here and there

这个类型转换是做什么的?

ph = (struct Proghdr *)((uint8_t *) ELFHDR + ELFHDR->e_phoff);

这里,ELFHDR已经定义为#define ELFHDR ((struct Elf *) 0x10000)

请问:最后ph里面的值是(struct Proghdr *)那么(uint8_t *)需要什么?

如果有人能解决我关于类型转换的问题,我将不胜感激。

C 中的指针运算是以 pointed-to 类型大小的单位执行的。因此,例如,如果 p 是指向 double 的指针,则 p = p + 1 会将 double 的大小(以字节为单位)添加到 [=] 中存储的地址10=].

在您的情况下,pointed-to 结构的 e_phoff 成员包含某些特定数据的 byte 偏移量;但是,只需将该值添加到 ELFHDR 指针本身(属于 Elf* 类型)就会将该值乘以 Elf 结构的大小。因此,为了正确使用该字节偏移量,首先将指针转换为 uint8_t*,以便根据原始(单个)字节执行任何指针运算。

记住等效项 p[i] == *( p + i )

给定指针 p 和整数 ip + i 将指针 p 前进 i*p 的大小。

例如,您看到 p 提前了 uint32_t 时间大小的 8 倍,如下所示:

uint32_t a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
uint32_t *p = a;
p = p + 8;
printf( "%" PRIu32 "\n", *p );  // 8

因此,如果您想将指针前进 i 字节 ,您需要一个指向字节 (char) 的指针。

uint32_t a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
uint32_t *p = a;
p = (uint32_t *)( (char *)p + 8 );
printf( "%" PRIu32 "\n", *p );  // 2

uint8_t 相当于您发布的代码段中的 char

Demo 在编译资源管理器上