youxixingzhet 发表于 2022-5-25 21:36:47

结构体指针的问题

A:
...
void releaseLibrary(struct Book **library)
{
      struct Book *temp;
   
      while (*library != NULL)
      {
                temp = *library;
                *library = (*library)->next;
                free(temp);
      }
}
...
int main(void)
{
      struct Book *library = NULL;
      ...
      releaseLibrary(&library);
   
      return 0;
}



B:
...
void releaseLibrary(struct Book *library)
{
      struct Book *temp;
   
      while (library != NULL)
      {
                temp = library;
                library = library->next;
                free(temp);
      }
}
...
int main(void)
{
      struct Book *library = NULL;
      ...
      releaseLibrary(library);
   
      return 0;
}


A代码中传参时加了取址符 B代码中没加
都是传地址 用法上有什么不同吗? 实际效果我感觉是一样的啊?
或者说有什么好处大佬给我讲讲呀!~

风车呼呼呼 发表于 2022-5-25 22:53:23

A是移动(主函数中的)library指针,函数调用返回后,library指针将指向NULL;

B是创建一个新指针变量接收library指针的值,也就是弄了一个和library指向位置相同的新指针,通过移动这个新指针来释放空间,函数调用返回后,library指针指向的位置不变,还是指向链头,而且这片空间已经被释放,如果再对library执行间接访问操作,访问的这片空间是非法的

jhq999 发表于 2022-5-25 22:54:31

A里面子程序返回后
library = NULL;
B返回后library值不变
这就是函数的实参和形参的问题

youxixingzhet 发表于 2022-5-26 09:05:08

风车呼呼呼 发表于 2022-5-25 22:53
A是移动(主函数中的)library指针,函数调用返回后,library指针将指向NULL;

B是创建一个新指针变量接 ...

A中传入的是library指针的地址

B中传入的是library变量的地址

不是说只要传地址 其他函数都可以影响这个地址里的值才对啊

难道你说的意思是A中传入的是地址而B中传入的是library的指针 是一个值不是一个地址?

风车呼呼呼 发表于 2022-5-26 10:53:37

youxixingzhet 发表于 2022-5-26 09:05
A中传入的是library指针的地址

B中传入的是library变量的地址


你说反了,A传的是library变量的地址,B传的是library的值(该指针指向的地址)
搞清楚光说地址的话,指针变量有两个“地址”,一个是它所指向的地址(在这里就是链头位置),另一个是存放这个变量本身的地址

把结构体地址比作房屋地址,那指针就是门牌

A传入的是这块门牌的地址,也就是该函数能找得到门牌,通过间接访问操作得知门牌上的内容,也就是找到房屋的地址,同样也是通过间接访问操作对门牌的内容进行修改,让它指向下一块房屋的地址,直到指向链尾(NULL)

B传入的是这块门牌上面的内容,所以B并不知道这块门牌在哪,也就无法修改门牌本身的位置。它是用了一个新门牌记录了房屋地址,并且执行同上操作

youxixingzhet 发表于 2022-5-26 17:41:05

风车呼呼呼 发表于 2022-5-26 10:53
你说反了,A传的是library变量的地址,B传的是library的值(该指针指向的地址)
搞清楚光说地址的话,指 ...

我也翻了很多资料 我叙述一遍大佬看看对不对

A中传入library这个指针的指针(&library) 在子函数里可以修改library这个指针(library本身的地址值) 在主函数里也随之被更改地址值(library)及地址值里的变量(*library)

B中传入的是library这个指针的地址(library) 在子函数里修改library本身的地址值在主函数中无法体现 但在子函数内修改地址值里的数据(*library) 主函数内的变量(*library)也会被修改 但是指向变量的地址不变

对嘛对嘛大佬

风车呼呼呼 发表于 2022-5-26 18:06:32

youxixingzhet 发表于 2022-5-26 17:41
我也翻了很多资料 我叙述一遍大佬看看对不对

A中传入library这个指针的指针(&library) 在子函数里可 ...

暂时目测大概没错。指针新学理解有困难是正常的,这次懂了下次也许还会被绕进去,多捋捋逻辑就行
页: [1]
查看完整版本: 结构体指针的问题