一个很好理解结构和指针的例子
时间:2005-11-03 来源:redog
Given a pointer to member a within a struct, write a routine that returns a pointer to the struct.
struct s
{
...
int a;
…
};
struct s* get_s_ptr(int * a_ptr)
{
return (struct s*)((void*)a_ptr-(int)(&((struct s*)0)->a));
}
struct s* get_s_ptr(int * a_ptr)
{
return (struct s*)((char*)a_ptr-(int)(&((struct s*)0)->a));
}
原因
按照ANSI(American National Standards Institute)标准,不能对void指针进行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
还有这里也可以这样些写
struct s* get_s_ptr(int * a_ptr)
{
return (struct s*)((char*)a_ptr+(int)(&((struct s*)0)->a));
}
这与系统的结构有关系,数据的存储顺序