第九章实例13
还有0人有此问题
发表在C语言图书答疑 2021-04-12
是否精华
版块置顶:

老师,函数的嵌套调用和递归调用有啥区别啊。递归调用为什么生命函数的时候要用到指针的指针来声明形参。代码中第30行的实参+1是不是地址偏移到了下一个位置的地址,还是扫描?递归都是怎么用的啊?老师啊,麻烦您给详细讲讲呗。

分享到:
精彩评论 18
18652179116
学分:750 LV7
2021-04-13
11L

李木子 发表于2021-04-13 14:50

这个问题
程序是这样运行的,主函数中调用DisplayNames,然后进入到自定义DisplayNames函数,判断if不符合,进入到else里,到else里就进行递归了,递归顺序就按名字那顺序一个一个递归,递归到end,执行了if,就return了,退出程序之后 才执行printf那句,依然是递归+输出,经过一次递归,此时指针已经直到了ken,就输出ken,再依次进行  这用f11就能看出来

老师:这个输出的我F11了,就在30-31-30-31来回跳,然后输出。您刚刚说,一次递归以后,指针已经指到了ken了。那么问题来了,此时的指针是*cnamearray存储的canmes[]的地址对不对?也就是*cnamearray的地址的位置对不对?那么既然此时已经指向了“ken”,cnamearray+1就是*cnamearray自己的地址偏移了一个sizeof(char*)对不对.如果我以上的理解是对的,那此时的指针在输出的时候应该往更高的地址偏移啊,怎么会输出来的逆序的字符串?老师,我就卡在这里了

18652179116
学分:750 LV7
2021-04-13
12L

李木子 发表于2021-04-13 15:00

先执行了一遍递归,并没有执行printf,直到满足if那句之后,return了,此时递归的指针已经指到了Ken   。。。。跳出了递归后,执行输出printf那句,输出了ken,然后又回到了递归那句,递归释放了ken之后,接着走ken上一个Sam,这样就输出了Sam,依次类推

老师:您的这句话:“递归释放了ken之后,接着走ken上一个Sam,”为什么接着走上一个sam,递归函数里面明明是指针变量cnamearray+1了啊~!

老师,这个指针此时是在内存堆区,还是栈区?

李木子
学分:2954 LV11
2021-04-13
13L

18652179116 发表于2021-04-13 15:14

老师:这个输出的我F11了,就在30-31-30-31来回跳,然后输出。您刚刚说,一次递归以后,指针已经指到了ken了。那么问题来了,此时的指针是*cnamearray存储的canmes[]的地址对不对?也就是*cnamearray的地址的位置对不对?那么既然此时已经指向了“ken”,cnamearray+1就是*cnamearray自己的地址偏移了一个sizeof(char*)对不对.如果我以上的理解是对的,那此时的指针在输出的时候应该往更高的地址偏移啊,怎么会输出来的逆序的字符串?老师,我就卡在这里了

跳出递归之后 就输出了 指针不往下加了 而是一个一个输出了 就相当于一个一个释放了

李木子
学分:2954 LV11
2021-04-13
14L

18652179116 发表于2021-04-13 15:37

老师:您的这句话:“递归释放了ken之后,接着走ken上一个Sam,”为什么接着走上一个sam,递归函数里面明明是指针变量cnamearray+1了啊~!

老师,这个指针此时是在内存堆区,还是栈区?

栈区 后进先出

18652179116
学分:750 LV7
2021-04-13
15L

李木子 发表于2021-04-13 15:37

跳出递归之后 就输出了 指针不往下加了 而是一个一个输出了 就相当于一个一个释放了

老师,能讲讲这个释放的过程不

李木子
学分:2954 LV11
2021-04-14
16L

来看图示:

image.png

18652179116
学分:750 LV7
2021-04-14
17L

李木子 发表于2021-04-14 08:42

来看图示:

image.png

噢噢噢噢,有领悟到了。因为那个二级指针数据就存储在栈区的,在栈区储存的时候就是一个一个存到栈区里面的,然后此时的函数(递归)调用还没有结束,并没有回到主函数中去,所以此时的栈区数据系统并没有自动销毁掉。而在接下来的打印中,又把这些数据打印出来了。因为栈区是后进先出的,所以存在最上面的地址的值就会被先打印出来,因为先释放的,也因为这是栈区,栈区就这样。也可以说实际上是利用了栈区的性质实现了逆序的输出。这么理解对的吧老师

李木子
学分:2954 LV11
2021-04-15
18L

18652179116 发表于2021-04-14 15:42

噢噢噢噢,有领悟到了。因为那个二级指针数据就存储在栈区的,在栈区储存的时候就是一个一个存到栈区里面的,然后此时的函数(递归)调用还没有结束,并没有回到主函数中去,所以此时的栈区数据系统并没有自动销毁掉。而在接下来的打印中,又把这些数据打印出来了。因为栈区是后进先出的,所以存在最上面的地址的值就会被先打印出来,因为先释放的,也因为这是栈区,栈区就这样。也可以说实际上是利用了栈区的性质实现了逆序的输出。这么理解对的吧老师

对 终于顿悟了

首页上一页 12 下一页尾页 18 条记录 2/2页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照