|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shiwobuhaoma 于 2021-3-20 09:40 编辑
- #include<stdio.h>
- #include<stdlib.h>
- struct Book{
- char title[120];
- char author[40];
- struct Book *next;
- };
- void initBook(struct Book *book){
- ...
- }
- //头插法,所以函数参数是一个指向一级指针地址的二级指针
- void addBookToLibrary(struct Book **library){
- struct Book *book,*temp;
- book = (struct Book *)malloc(sizeof(struct Book));
- if(book == NULL){
- printf("内存不足");
- exit(1);
- }
- initBook(book);
- //我的疑问出现在这里的*library上!!
- //这里的*是取指针指向的变量中存储的值,又因为library是一个二级指针,所以*library就代表是取二级指针指向的变量中保存的值?不知道可不可以这么理解?这么理解对吗?
- //如果不对,错在了哪里?
- if(*library != NULL){ //这里的判断是链表的头结点是否不为空
- temp = *library;
- *library = book;
- book->next = temp;
- }else{
- *library = book;
- book->next = NULL;
- }
-
- }
- int main(void){
- struct Book *library = NULL;
- //这里是传的一级指针的地址
- initLibrary(&library);
- }
复制代码
本帖最后由 jackz007 于 2021-3-20 11:35 编辑
首先,看看这个例子:
- #include <stdio.h>
- void foo(int ** p)
- {
- * p += 5 ;
- }
- main(void)
- {
- int a[] = {1 , 10 , 100 , 1000 , 10000 , 100000} , * p ;
- p = & a[0] ; // p 指向 a[0]
- printf("p = %p , * p = %d\n" , p , * p) ; // 打印 p 及 a[0] 的数值
- foo(& p) ; // 调用过后,p 指向 a[5]
- printf("p = %p , * p = %d\n" , p , * p) ; // 打印 p 及 a[5] 的数值
- }
复制代码
编译、运行实况
- D:\00.Excise\C>g++ -o x x.c
- D:\00.Excise\C>x
- p = 0022FEA8 , * p = 1
- p = 0022FEBC , * p = 100000
- D:\00.Excise\C>
复制代码
通过这个例子我们看到,调用过 foo(& p) 之后,一级指针 p 的数值被改变,是的,这就是本例也是楼主问题的核心要义!
看懂了上面的例子,我想,楼主的问题也就不再需要多做解释了
- int main(void){
- struct Book * lib = NULL ;
- . . . . . .
- addBookToLibrary(& lib) ; // lib 是一级指针,& lib 成为二级指针,这样调用函数的目的,通常是为了在函数中修改调用参数 lib 的数值
- }
- . . . . . .
- void addBookToLibrary(struct Book ** library) // 传递二级指针的目的,是为了修改一级指针 (* library) 的数值
- {
- if(* library != NULL){ // 函数中需要使用一级指针,那么,* library 就是一级指针
- temp = * library ;
- * library = book ; // 一级指针被赋值,意味着调用参数被修改,修改 * library 就是修改 main() 中的调用参数 lib 的值
- book->next = temp ;
- }else{
- *library = book ; // 一级指针被赋值,意味着调用参数被修改,修改 * library 就是修改 main() 中的调用参数 lib 的值
- book->next = NULL ;
- }
-
- }
复制代码
|
|