一直无法静下心来学习数据结构,总是觉得太难呵呵,今晚,决定认真地学习他,学好他,就看了链表,就难住了。
我看到它初始化链表的函数是这样写的:
void InitList(struct sNode **HL)
{
*HL=NULL;
}
我看到形参就愣了,初始化链表,不就是将表头指针置为空指针吗?为什么要用二级指针,直接将表头指针置空不就行了吗?如:
void InitList(struct sNode *HL)
{
HL=NULL;
}
这就是我的疑问。
但我想,他这样写,应该是有他的意思,应该不会是作者的错或者打印的错,那么,就只能是我错了,那又是为什么呢?为什么要用二级指针?
接下来是重点了,是我自己对这个问题的想法,但身边没什么人可问,也不敢肯定,所以就来发贴了,我是这样想的:
我们都知道,C语言的函数调用有传值和传址之分,将一个常规变量的地址传递给一个相应类型的指针形参,那么,就可以改变这个变量的值,而直接将这个变量传过去,却是不行,因为传值的思想是“将变量复制多一份”,那么,对于指向结构体的指针,是不是也一样呢?我们虽然传的是指针,但实际上,传的是这支针所指向的结构体的未知地址(因为还没初始化,定义的时候系统随机分配空间,所以说不知这支针指向何处,用未知地址来表达不知可不可以),所以我们在初始化函数中修改到的并不是这支针,而是这支针所指向的结构体,所以,要达到初始化的目的,我们要传的,是这支针的地址,才能达到修改这支针的目的。
我是这样想,自己感觉好像也说得过去,但就是不敢肯定,请各位大虾解答解答。