使用offsetof执行指针算术示例

时间:2017-10-05 00:49:40

标签: c pointers struct

我试图通过使用## You need to unlist vector c and sort as below: sort(unlist(c)) #[1] "25" "5" "and" "Chpater" "Dr." "Eggs" #[7] "Green" "Ham" "p." "Sam-I-am!" "Seuss" "That" 宏来了解有关访问结构的问题,我遇到了这个例子How can I access structure fields by name at run time? 这一行:

offsetof()

给了我麻烦。 为什么指针被强制转换为//Set the value of 'a' using pointer arithmetic *(int *)((char *)structp + offsetf) = 5; 然后又转回char *

2 个答案:

答案 0 :(得分:3)

首先,结构指针必须转换为“字节指针”类型,因为offsetf很可能包含所需结构字段的字节偏移。由于这种强制转换,(char *)structp + offsetf子表达式中的指针算法以char个对象(以字节为单位)执行,完全按照我们的意愿执行。

其次,上面的子表达式为我们提供了一个类型char *的指针,指向所需的数据字段。但实际上,数据字段显然具有类型int。因此,为了获得对该数据字段的访问权限,我们必须将char *指针强制转换为正确的int *类型。之后,我们可以使用一元*运算符对该数据字段执行读取(或写入)访问。

在您的情况下,值5被写入位于int指向的对象内的字节偏移offsetf的{​​{1}}数据字段。

答案 1 :(得分:0)

因为按顺序:您将引用*内容放入int*,以便您可以访问数据并将其设置为5

转换为char *是因为char *转换为int *很容易,因为每个char都有一个整数值。