两个EdgeNode夹一个Node
在C中,各种类型的指针本身只是一个地址值,长度都是一样的。但是只知道地址值,你是没法确定往后多少bit是你真正有效的数据范围,所以指针就要加类型来确定往后取得范围。
所以你的struct里面那个嵌套的东西只是一个地址, 不是struct结构本身。到这里你的编译器是可以确认你整个结构体的大小的,你的例子中就是一个int,一个EdgeType,加一个地址的长度。
其实这个struct地址你甚至可以不用给确定类型,你里面声明一个void *也可以,只是用的时候再转型成EdgeNode也可以。
例如:下面的例子,两个EdgeNode夹一个Node(next项void*,未指定类型)大小是一样的,也可以连成 链表,由头节点可以访问next项,遍历整个链表。
#include<stdio.h>
struct EdgeNode{
int a;
int b;
struct EdgeNode *next;
};
struct Node{
int a;
int b;
void *next;
};
int main()
{ struct EdgeNode node1;
struct Node node2;
//%u 无符号10进制整数
printf("%u==%u\n",sizeof(node1),sizeof(node2));
//创建链表节点,其中头尾是EdgeNode类型,中间body为Node类型,将3个节点连起来。
struct EdgeNode head,tail;
struct Node body;
tail.a=10;
tail.b=20;
body.a=40;
body.b=50;
head.next=(struct EdgeNode *)&body;
body.next=&tail;
tail.next=NULL;
// 由头部遍历链表
struct EdgeNode *p=head.next;
printf("body:%d %d\n",p->a,p->b);
printf("tail:%d %d\n",p->next->a,p->next->b);
}