公司网站备案怎么做/账户竞价托管哪里好
单链表的C语言实现如下:
typedef struct node{ //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
}ListNode;
即定义了一个结构体 node,将他重新命名为ListNode~
我的疑惑是,结构体名为 node,但是在结构体的定义中,居然还有一个 node 类型的变量,
相当于在类MyClass中定义一个MyClass类型的私有成员变量~~这点让我很费解,后来才明白,这两者关系其实是不一样的
具体解释
解释一:
struct MyClass
{
int a;
MyClass *p
}
不管什么类型的指针,在32位程序里面都是32位四个字节。
所以说这个MyClass已经很明确了,总共8个字节,完全有意义啊。
struct MyClass; void main() { MyClass *p = 0; } |
就像这段代码完全合法一样,MyClass具体是什么都不知道,但仍然可以使用它的指针,因为不管它是什么类型的指针,都是四个字节,都是一样的
解释二:
你只要记住一点,编译器很聪明,能够明白你这段代码代表什么意思,就够了,如果再要深究,就只能研究编译原理了。
编译器先看到你定义了结构,然后看见你在这个结构体中又使用了这个结构,因为编译器已经知道这是一个结构体,所以他可以处理这种情况。如果你把结构中的struct node *next; 这一句,替换成}ListNode *next; 编译器就会报错,因为他还没有看见过这个ListNode是什么东西。
另外,你不能在你的结构体中,再定义一个非指针类型的同样的结构体,例如struct node next;(注意,没有星号),这时,编译器也应该报错,为什么,因为这会导致定义的无限延伸!也就是说,这个定义是一个死循环,永远停不下来。
所以说,链表的C语言实现中,之所以能这样使用,是因为里面的那个变量时指针,而指针所占的字节数是已知的(不管什么类型指针,在32位操作系统中,都是占 4 个字节)