洛城闻笛 发表于 2018-11-8 22:37:59

S1E45的单链表程序不懂

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 }

丶忘却的年少o 发表于 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

洛城闻笛 发表于 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 对吗?

洛城闻笛 发表于 2018-11-9 16:14:41

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

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

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

丶忘却的年少o 发表于 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;
}

洛城闻笛 发表于 2018-11-10 14:10:36

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

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

还有一个问题需要请教一下,在什么情况下,我们需要传入二级指针,或者说是比这参数高一级的指针,是在需要改变这个参数本身的值的时候吗?

丶忘却的年少o 发表于 2018-11-10 15:07:55

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

你已经说出了答案,当一个参数要去别的函数,返回的时候需要让他改变,那么我们就传高级指针;
如果没用,只是说传过去方便那个函数的运算或者说明操作,那只要传等价的就好了,反正回来还是自己

洛城闻笛 发表于 2018-11-11 12:23:21

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

嗯嗯,好的谢谢你了,以后要问题我再来请教你,不吝赐教

丶忘却的年少o 发表于 2018-11-12 09:29:40

洛城闻笛 发表于 2018-11-11 12:23
嗯嗯,好的谢谢你了,以后要问题我再来请教你,不吝赐教

OK,不过我不一定常在,我记得上次活跃还在去年{:10_266:}

洛城闻笛 发表于 2018-11-12 21:30:39

丶忘却的年少o 发表于 2018-11-12 09:29
OK,不过我不一定常在,我记得上次活跃还在去年

那大神留个qq吧
页: [1]
查看完整版本: S1E45的单链表程序不懂