user-0 提问: 求大佬帮我解释这段单链表代码，求求孩子吧，卡了三天了

回复:
user: user-1
content: 引用 3 楼 Tryagain2006 的回复：void addBook(struct Book **library) //这里的参数是个二级指针，目的是为了修改指针的地址，但函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？  这个问题是这样的。在 main 函数中 library 为指针，现在希望在子函数中 修改指针 library，所以子函数的参数就要使用二级指针。可

user: user-2
content: 岔路口 学习.

user: user-3
content: 不错的资源，很好

user: user-3
content: 太过精偏！！！！！！！！

user: user-4
content: 二级指针的目的是为了可以修改这个一级指针的指向，否则只能修改这个指针指向那块结构的内容，任何对于指针本身的修改都是不生效的，类似于 int max(const int a,const int b,int max) //不能修改max值 int max(const int a,const int b,int * max) //可以修改max值

user: user-5
content: 引用 11 楼 weixin_45906870 的回复:没看懂...我的意思是addBook这个函数的参数为什么不能是一级指针？  作为基本概念，您是否注意到，C语言在函数之间进行参数传递遵守的是规则是单向的“值传递”，所以要用 swap 函数交换main 函数中两个 int 类型变量值的时候，在swap 函数的参数中要使用 int * 作为参数。这是所有讲C语言的教材中都会说到的例子。这样，在 swap 函数中才能改变 main 函数中变量的值。  同理，在 main 函数中 library 为指针，现在希望在子函数中 修改 指针 library，所以子函数的参数就要使用二级指针。

user: user-0
content: 没看懂...我的意思是addBook这个函数的参数为什么不能是一级指针？

user: user-6
content: addBook(&library);  这里传进去的是library的地址，是这个指针本身的地址，如果子函数里只用 一个*，那么得到的是这个指针的地址，而不是它指向结构体的地址，所以要用 **

user: user-0
content: 引用 6 楼 自信男孩 的回复：#include <stdio.h> #include <stdlib.h>  struct Book {     char title[128];     char author[40];     struct Book *next; };  void getInput(struct Book *book) {     printf("请输入书名：");     scanf("%s", book->title);     printf("请输入作者：");     scanf("%s", book->author); }  void addBook(struct Book **library)     //这里的参数是个二级指针，目的是为了修改指针的地址，但是这个函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？ {     struct Book *book, *temp;      book = (struct Book *)malloc(sizeof(struct Book));      //这里为什么用了malloc申请空间，目的是什么？不用有什么影响？     if (!book)  //不加这句是做啥，不想让程序运行了吗？     {         printf("内存分配失败了！\n");         exit(1);     }      getInput(book);      if (*library != NULL)     {         temp = *library;         *library = book;         book->next = temp;     }     else     {         *library = book;         book->next = NULL;     } }  void printLibrary(struct Book *library) {     struct Book *book;     int count = 1;      book = library;     while (book != NULL)     {         printf("Book%d: ", count);         printf("书名：%s", book->title);         printf("作者：%s", book->author);         putchar(10);         book = book->next;         count++;     } }  //void releaseLibrary(struct Book *library) void releaseLibrary(struct Book **library) {     struct Book *pcur = *library, *ptmp; #if 0     while (library != NULL)     {         free(library);         library = library->next;     } #else     while (pcur) {         ptmp = pcur->next;         free(pcur);         pcur = ptmp;     }     *library = NULL;  #endif } int main() {     struct Book *library = NULL;     int ch;      while (1)     {         printf("请问是否需要录入书籍信息（Y/N）：");         do         {             ch = getchar();             getchar();    //for '\n'         } while (ch != 'Y' && ch != 'N');          if (ch == 'Y')         {             addBook(&library);             getchar();    //for '\n'         }         else         {             break;         }     }      printf("请问是否需要打印图书信息（Y/N）:");     do     {         ch = getchar();         getchar();    //for '\n'     } while (ch != 'Y' && ch != 'N');      if (ch == 'Y')     {         printLibrary(library);     }      releaseLibrary(&library);      return 0; }  供参考～  注意getchar()和scanf("%c", xxx);比较特殊需要处理'\n' 建议对比代码找出自己的问题～感谢，不过那个二级指针的问题我还是不懂

user: user-0
content: 引用 7 楼 Tryagain2006 的回复：[quote=引用 5 楼 weixin_45906870 的回复:] [quote=引用 3 楼 Tryagain2006 的回复：]void addBook(struct Book **library) //这里的参数是个二级指针，目的是为了修改指针的地址，但函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？  这个问题是这样的。在 main 函数中 library 为指针，现在希望在子函数中 修改指针 library，所以子函数的参数就要使用二级指针。可是子函数中没有用到二级指针啊，全是一级指针[/quote]  呵呵，你的基本概念有问题。[/quote]？？？

user: user-5
content: 引用 5 楼 weixin_45906870 的回复:[quote=引用 3 楼 Tryagain2006 的回复：]void addBook(struct Book **library) //这里的参数是个二级指针，目的是为了修改指针的地址，但函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？  这个问题是这样的。在 main 函数中 library 为指针，现在希望在子函数中 修改指针 library，所以子函数的参数就要使用二级指针。可是子函数中没有用到二级指针啊，全是一级指针[/quote]  呵呵，你的基本概念有问题。

user: user-7
content: #include <stdio.h> #include <stdlib.h>  struct Book {     char title[128];     char author[40];     struct Book *next; };  void getInput(struct Book *book) {     printf("请输入书名：");     scanf("%s", book->title);     printf("请输入作者：");     scanf("%s", book->author); }  void addBook(struct Book **library)     //这里的参数是个二级指针，目的是为了修改指针的地址，但是这个函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？ {     struct Book *book, *temp;      book = (struct Book *)malloc(sizeof(struct Book));      //这里为什么用了malloc申请空间，目的是什么？不用有什么影响？     if (!book)  //不加这句是做啥，不想让程序运行了吗？     {         printf("内存分配失败了！\n");         exit(1);     }      getInput(book);      if (*library != NULL)     {         temp = *library;         *library = book;         book->next = temp;     }     else     {         *library = book;         book->next = NULL;     } }  void printLibrary(struct Book *library) {     struct Book *book;     int count = 1;      book = library;     while (book != NULL)     {         printf("Book%d: ", count);         printf("书名：%s", book->title);         printf("作者：%s", book->author);         putchar(10);         book = book->next;         count++;     } }  //void releaseLibrary(struct Book *library) void releaseLibrary(struct Book **library) {     struct Book *pcur = *library, *ptmp; #if 0     while (library != NULL)     {         free(library);         library = library->next;     } #else     while (pcur) {         ptmp = pcur->next;         free(pcur);         pcur = ptmp;     }     *library = NULL;  #endif } int main() {     struct Book *library = NULL;     int ch;      while (1)     {         printf("请问是否需要录入书籍信息（Y/N）：");         do         {             ch = getchar();             getchar();    //for '\n'         } while (ch != 'Y' && ch != 'N');          if (ch == 'Y')         {             addBook(&library);             getchar();    //for '\n'         }         else         {             break;         }     }      printf("请问是否需要打印图书信息（Y/N）:");     do     {         ch = getchar();         getchar();    //for '\n'     } while (ch != 'Y' && ch != 'N');      if (ch == 'Y')     {         printLibrary(library);     }      releaseLibrary(&library);      return 0; }  供参考～  注意getchar()和scanf("%c", xxx);比较特殊需要处理'\n' 建议对比代码找出自己的问题～

user: user-0
content: 引用 3 楼 Tryagain2006 的回复：void addBook(struct Book **library) //这里的参数是个二级指针，目的是为了修改指针的地址，但函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？  这个问题是这样的。在 main 函数中 library 为指针，现在希望在子函数中 修改指针 library，所以子函数的参数就要使用二级指针。可是子函数中没有用到二级指针啊，全是一级指针

user: user-5
content: book = (struct Book *) malloc(sizeof(struct Book)); //这里为什么用了malloc申请空间，目的是什么？不用有什么影响？  book 是一个指向结构的指针，book要必须指向一个“实体”之后才能进行后续的操作，所以要为 book 分配一个空间，用来存储实际的数据。

user: user-5
content: void addBook(struct Book **library) //这里的参数是个二级指针，目的是为了修改指针的地址，但函数里面只用到了一级指针，那为什么还要弄个二级指针作参数？  这个问题是这样的。在 main 函数中 library 为指针，现在希望在子函数中 修改指针 library，所以子函数的参数就要使用二级指针。

user: user-0
content: 引用 1 楼 Tryagain2006 的回复：题目是什么？有什么问题？我都用红色字体标注了

user: user-5
content: 题目是什么？有什么问题？