其实你的理解是完全正确的,只不过在这里你没有把malloc这个函数完全理解。函数CreateList()是为了创建一个列表。
所以根据你的第一段代码你会这样写:
LinkList* ha;
CreateList(&ha);
而根据你的第二段代码你会这样:
LinkList* ha;
CreateList(ha);
第二段代码的ha完全是如你所说的那样是值传递的。再看你的函数体,我们知道形参名为L,它所指向的地址会等于ha所指向的地址(也就是说L的值等于ha的值)。可是在你的函数体内你用malloc申请了一块内存,你把这块内存的地址赋值给了L(此时L的值就不再等于ha的值了)现在malloc所申请有内存也只有L能引用,而ha根本没有得到分配的内存。
如果用你的第一段代码:
我们知道传进去的是ha的地址。此时你把malloc申请的内存的地址赋值给*L,而*L刚好也就是ha。所以也就相当于给ha申请了一块内存。*L和ha都指向了新开辟的内存。这才算得上是真正的创建了一个列表。
malloc这个函数是在内存中申请一片空间,并返回指向这片空间的地址。