鱼C论坛

 找回密码
 立即注册
查看: 1795|回复: 6

[已解决]结构体指针的问题

[复制链接]
发表于 2022-5-25 21:36:47 | 显示全部楼层 |阅读模式

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

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

x
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-26 18:06:32
youxixingzhet 发表于 2022-5-26 17:41
我也翻了很多资料 我叙述一遍大佬看看对不对

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

暂时目测大概没错。指针新学理解有困难是正常的,这次懂了下次也许还会被绕进去,多捋捋逻辑就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-25 22:53:23 | 显示全部楼层
A是移动(主函数中的)library指针,函数调用返回后,library指针将指向NULL;

B是创建一个新指针变量接收library指针的值,也就是弄了一个和library指向位置相同的新指针,通过移动这个新指针来释放空间,函数调用返回后,library指针指向的位置不变,还是指向链头,而且这片空间已经被释放,如果再对library执行间接访问操作,访问的这片空间是非法的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-25 22:54:31 | 显示全部楼层
A里面子程序返回后
library = NULL;
B返回后library值不变
这就是函数的实参和形参的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-26 09:05:08 | 显示全部楼层
风车呼呼呼 发表于 2022-5-25 22:53
A是移动(主函数中的)library指针,函数调用返回后,library指针将指向NULL;

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

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

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

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

难道你说的意思是A中传入的是地址  而B中传入的是library的指针 是一个值不是一个地址?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-26 10:53:37 | 显示全部楼层
youxixingzhet 发表于 2022-5-26 09:05
A中传入的是library指针的地址

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

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

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

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

B传入的是这块门牌上面的内容,所以B并不知道这块门牌在哪,也就无法修改门牌本身的位置。它是用了一个新门牌记录了房屋地址,并且执行同上操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)也会被修改 但是指向变量的地址不变

对嘛对嘛大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-26 18:06:32 | 显示全部楼层    本楼为最佳答案   
youxixingzhet 发表于 2022-5-26 17:41
我也翻了很多资料 我叙述一遍大佬看看对不对

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

暂时目测大概没错。指针新学理解有困难是正常的,这次懂了下次也许还会被绕进去,多捋捋逻辑就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 16:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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