二级指针理解
第一次的代码 (低级错误)
int init(Node *phead)
{
phead = (Node *)malloc(sizeof(Node));//只是改变了副本的值 毫无malloc的意义
phead->next = NULL;
phead->val = NULL;
}
int main(){
Node *phead;
init(phead);
// 为什么传入不了值呢?
// 因为phead是拷贝副本,malloc分配空间后phead值有改变但是这里并没有带回,仍然是拷贝副本
}
第二次改进代码(中级错误)
int init(Node **phead)
{
phead = (Node **)malloc(sizeof(Node));
(*phead)->next = NULL; //这里会运行报错 malloc后的*phead仍然没有值
(*phead)->val = NULL;
// 为什么二级指针报错?
// malloc是给指针分配空间,二级指针已经有空间存地址了,需要给一级指针分配存放Node节点的空间,所以next会报错。
}
int main(){
Node *phead;
init(phead);
}
最后的正确代码
int init(Node **phead)
{
*phead = (Node *)malloc(sizeof(Node)); //表示意义是给*phead分配空间,因为这里存放的是节点数据, 这里既不能是**phead也不可以是phead!!
(*phead)->next = NULL; //这里会运行报错
(*phead)->val = NULL;
// 为什么二级指针报错?
// malloc是给指针分配空间,二级指针已经有空间存地址了,需要给一级指针分配存放Node节点的空间,所以next会报错。
}
int main(){
Node *phead;
init(&phead);
}
PS:
// 根据二级指针再写点内容:二级指针要指向两次才能找到最终的指向的内存块
二级指针 有效的内存地址开始位置 p2->p1->data
一级指针 有效的内存地址开始位置 p1->data
一级指针中 p 表示指针内容的有效地址
一级指针中 *p 表示指针内容
一级指针中 &p 表示指针变量地址
二级指针中 p 表示指针内容的有效地址
二级指针中 **p 表示指针内容
二级指针中 &p 表示指针变量地址
二级指针中 *p表示的一个中间值 没有什么太大意义
引用一个图 更形象的表示指针: