今天再写链表的过程中,引发了思考,为什么链表要用指针?
比如,有这样一个结构体:

  1. struct Node {
  2. int data;
  3. struct Node* next;
  4. }

平常我们创建空链表是这样的:

  1. struct Node* head;

那为什么不是:

  1. struct Node head;

如果你创建一个结构体变量:struct Node head 。那么,就不能当成中间结点,因为 Nodenext 必须是指针。只能作为头结点使用,而且使用起来非常麻烦,比如你要调用下一个结点:head.next 而不是 head->next。这样就要重写一部分代码,从而使得维护困难。
另一个是,创建这样的结构体:

  1. struct Node {
  2. int data;
  3. struct Node next; ---> is not pointer
  4. }

这样创建相同的结果,首先是编译器会编译错误。
另外,这样来看:比如你要为上述结构体开辟空间:

  1. malloc(sizeof(Node));

这样就会开辟 sizeof(int) + sizeof(Node) 的空间,这样进一步开辟 sizeof(int) + (sizeof(int) + sizeof(Node)) 的空间,这样递归下去。所以定义这样的结构是没有意义的,故编译器就禁止了这一行为。

参考链接

https://www.coder.work/article/6996