二级指针正确使用方式

二级指针理解

第一次的代码 (低级错误)
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表示的一个中间值 没有什么太大意义

引用一个图 更形象的表示指针:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值