C语言中单链表的初始化

这是一个C语言单链表并带有头结点的链表初始化,哪里有错?形参带不带&有什么不一样?
#include
#include
typedef struct student
{
int number;
struct student* next;
}Node,*List;
void init(List w)//List &w
{
w=(List)malloc(sizeof(Node));
if(!w)
return;
w->next=NULL;
}
int main()
{
List list1;
init(list1);
return 0;
}

形参不用引用,你改变的只是那个函数中实参的副本,而实参本身并没有改变。
假设本来list1指向地址A,调用init函数后参数w的初值被初始化为A的地址。
执行w=(List)malloc(sizeof(Node));后w指向了新分配的地址,但是list1并没有改变。

你要通过init改变main函数的list1的指向(为它分配空间),必须传入一级指针的引用或者二级指针才行。
因为你需要改变指针的指向,如果仅仅需要改变指针所指的值,那么传一级指针足矣。
传一级指针意味着,main函数的list1和Init的形参w指向了同一块内存区域(但list1和w并不是同一个指针)

问题在w=(List)malloc(sizeof(Node));,List和Node不是同一类型,List是指针,一般相当与sizeof(int),Node则是结构体
像init的一般都是return比较好
关于形参带&的,http://c.biancheng.net/cpp/html/74.html解释了