我好像差不多懂了 我把我的理解贴上来 给大家分享一下
程序代码:
void main(void)
{
SLNode *head;// SLNode 是书本上之前定义好的结构 我在这里省略了
int i,x;
ListInitiate(&head);
......// 接下来的程序我省略了
}
//接下来是头文件里面函数的定义
ListInitiate(SLNoder **head)
{
if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)
exit(1);
(*head)->head=NULL;
}
//我之前有一个疑惑 就是为什么函数里面定义了一个**head 后可以直接使用 *head来接收值
//所以我做了如下的测试,自己编写了一个程序,
#include <stdio.h>
int main(void)
{
int **p,x=4;
*p=&x;
printf("x=%d,*p=%x",x,*p);
return 0;
}
//但是我发现运行到*p=&x 的时候程序就出错了 所以在这里定义了**p 却不能用像上面一样用*p来接收值使我感到困惑
//后来在大家的帮助下我发现了一个问题 ,ListInitiate(SLNoder **head) 在进行函数里面的语句之前 **head 已经得到了一个初值,
//这个初值就是主函数里面的语句 ListInitiate(&head); 给他的,所以他可以直接只用*head 来接收值,然而我定义的**p 没有初始化,所以就不能用*p来接收值
//再一次进行测试 就发现了答案
#include <stdio.h>
int main(void)
{
int **p,x=4,*q;
p=&q;
*p=&x;
printf("x=%d,&x=%x,*p=%x,**p=%d\n",x,&x,*p,**p);
return 0;
}