C语言中指针是其最有用的地方,用指针能够实现很多强大的功能. 下面介绍关于指针的一个细节.
#include <stdio.h> typedef struct Aa{ struct Aa* next; struct Aa* prev; }A; typedef struct{ int a; A seg; A List;//这个字段是保存头节点,头节点的下一个是seg类型的节点,实现了低耦合 }B; void init(A* pa){//初始化 pa->next=pa->prev=pa; } void listAdd(A* tmp,A* head){//加节点 tmp->next=head->next; head->next=tmp; tmp->next->prev=tmp; tmp->prev=head; } //下面是本来应该获取的是B结构体里面seg字段的地址,但是通过地址减去相应长度,获得B结构体的地址。具体可以减去sizeof(int),但是如果在seg前面的字段较多 //而且动态改变的时候则不太好处理。正确的做法应该是将B结构体放在0地址处,然后取seg字段,就获得了相对偏移地址,然后用之前获取的seg地址减去偏移量从而得到 //B结构体的首地址,这样就可以操作B了. #define LIST_ENTRY(Ptr,Type,Field) (Type*)((char*)Ptr-(char*)(& ((Type*)0)->Field)) int main(){ B head; init(&head.List); int i; B tmp[10]; tmp[0].a=10; for(i=0;i<10;i++){ listAdd(&tmp[i].seg,&head.List); } B* res=LIST_ENTRY(head.List.prev,B,seg);//这里不仅可以转化为B,还能转化为其他类型,只要转化后对该类型进行填充 printf("%d",res->a); return 0; }最后输出结果10