鱼C论坛

 找回密码
 立即注册
查看: 1462|回复: 9

[已解决]S1E45的单链表程序不懂

[复制链接]
发表于 2018-11-8 22:37:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.为什是**library,调用时addBook(&blirary)
2.book 与 library还有*library是什么关系

 26 void addBook(struct Book **library)//指向Book结构的指针的指针
 27 { 
 28   struct Book *book;
 29   struct Book *temp;//定义Book结构体类型的两个指针
 30   book=(struct Book*)malloc(sizeof(struct Book)); 
 31   if (book==NULL)
 32   { 
 33     printf("内存分配失败了!\n");
 34     exit(1);
 35   }
 36   getInput(book);
 37   if (*library!=NULL)
 38   { 
 39     temp=*library;
 40     *library=book;
 41     book->next=temp;
 42   
 43   }
 44   else    //如果是空链表
 45   { 
 46     *library=book; 
 47     book->next=NULL;
 48   }
 49 }
最佳答案
2018-11-9 13:16:51
1. library是一个指针对吧,假设指向a,现在要指向b。那就需要改变指针的指向,就需要用到比现在指针高一级的去改变自身,那就是指针的指针,即二级指针。也就是**library,既然需要二级指针,那么调用的时候就需要对指针取地址才能变成二级指针。
2. book是一级指针。你说的这个library是指这个函数里的library吗?我就当是来和你说吧。就像前面说的,library是二级指针了(参数里已经说明),那么*library就是一级指针。*library=book;这个语句就可以将*library的一级指针指向新出来的book上,再让book的next指向以前已经有的Book,而library自身没变。
就是library操作*library指向了新的book1,book1自身的next指向了以前的book0,这样又可以将Book串起来了,都在library的手下。
指针等级上来说,library > *library = book
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-9 13:16:51 | 显示全部楼层    本楼为最佳答案   
1. library是一个指针对吧,假设指向a,现在要指向b。那就需要改变指针的指向,就需要用到比现在指针高一级的去改变自身,那就是指针的指针,即二级指针。也就是**library,既然需要二级指针,那么调用的时候就需要对指针取地址才能变成二级指针。
2. book是一级指针。你说的这个library是指这个函数里的library吗?我就当是来和你说吧。就像前面说的,library是二级指针了(参数里已经说明),那么*library就是一级指针。*library=book;这个语句就可以将*library的一级指针指向新出来的book上,再让book的next指向以前已经有的Book,而library自身没变。
就是library操作*library指向了新的book1,book1自身的next指向了以前的book0,这样又可以将Book串起来了,都在library的手下。
指针等级上来说,library > *library = book
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-11-9 16:09:06 | 显示全部楼层
丶忘却的年少o 发表于 2018-11-9 13:16
1. library是一个指针对吧,假设指向a,现在要指向b。那就需要改变指针的指向,就需要用到比现在指针高一级 ...

不好意思我是才学的不太明白,请您赐教
 78 int main(void)
{
   struct Book *library=NULL;

1.比如说在调用函数之前,library指向a,在函数中要改变library的指向为什么不直接library =&b  ;是因为那个什么函数中什么副本吗?

2. 我现在主函数中调用 addBook(&blirary)  ,那么 此时传入的参数 &library 就等于addBook  函数中的 library 对吗? 所以(*blirary)就相当于主函数中的 library 对吗?

主函数中

主函数中

addBook()函数中

addBook()函数中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-9 16:14:41 | 显示全部楼层
丶忘却的年少o 发表于 2018-11-9 13:16
1. library是一个指针对吧,假设指向a,现在要指向b。那就需要改变指针的指向,就需要用到比现在指针高一级 ...

https://www.cnblogs.com/tianlangshu/p/5385195.html

这个就是说指针用作传出参数时需要二级指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-10 12:35:10 | 显示全部楼层
洛城闻笛 发表于 2018-11-9 16:14
https://www.cnblogs.com/tianlangshu/p/5385195.html

这个就是说指针用作传出参数时需要二级指针

你的理解是对的,但是只是在同一个函数的时候,就不需要用二级指针。
换个等效的简单题来和你说下,看下面的代码,为什么只有 b 的值能改变?
因为传参的时候必须要是高一级的指针才能改变自身的值。好了回到你的问题,为什么传给 add 这个函数的时候一定要二级指针?以为他要改变一级指针的指向,如果传同级别的一级指针,回到main函数后又变成main函数调用add前的状态了!
void fun1(int *num)
{
        (*num)++;
}


void fun(int num)
{
        num++;
}

int main()
{
        int a = 0, b = 0;        // 我要让值都为1

        fun(a);                                // 这里我只是传同级别的a
        fun1(&b);                        // 这里我传高级别的&b,也就是指针

        printf("a:%d,  b:%d", a, b);        // 只有b = 1

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-10 14:10:36 | 显示全部楼层
丶忘却的年少o 发表于 2018-11-10 12:35
你的理解是对的,但是只是在同一个函数的时候,就不需要用二级指针。
换个等效的简单题来和你说下,看下 ...

谢谢您的解释我懂了,我看了一个贴子就是说我们传过去的参数他会生成一个副本,返回主函数是参数还是不变的,所以我们的改变那个地址里面的值,就需要二级指针了。

还有一个问题需要请教一下,在什么情况下,我们需要传入二级指针,或者说是比这参数高一级的指针,是在需要改变这个参数本身的值的时候吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-10 15:07:55 | 显示全部楼层
洛城闻笛 发表于 2018-11-10 14:10
谢谢您的解释我懂了,我看了一个贴子就是说我们传过去的参数他会生成一个副本,返回主函数是参数还是不变 ...

你已经说出了答案,当一个参数要去别的函数,返回的时候需要让他改变,那么我们就传高级指针;
如果没用,只是说传过去方便那个函数的运算或者说明操作,那只要传等价的就好了,反正回来还是自己
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-11 12:23:21 | 显示全部楼层
丶忘却的年少o 发表于 2018-11-10 15:07
你已经说出了答案,当一个参数要去别的函数,返回的时候需要让他改变,那么我们就传高级指针;
如果没用 ...

嗯嗯,好的谢谢你了,以后要问题我再来请教你,不吝赐教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-12 09:29:40 | 显示全部楼层
洛城闻笛 发表于 2018-11-11 12:23
嗯嗯,好的谢谢你了,以后要问题我再来请教你,不吝赐教

OK,不过我不一定常在,我记得上次活跃还在去年
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-12 21:30:39 | 显示全部楼层
丶忘却的年少o 发表于 2018-11-12 09:29
OK,不过我不一定常在,我记得上次活跃还在去年

那大神留个qq吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 18:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表