C语言指针细节

    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

猜你喜欢

转载自blog.csdn.net/whitenigt/article/details/80274862