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

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

分享到:
精彩评论 18
18652179116
学分:750 LV7
2021-04-12
沙发

老师,还是这个实列,还有问题,我持续看了好几遍,先不去管按个**指针的指针,就单纯的看第30行代码,又回到了22行去了对吗?也就是相当于是数组下标+1了,然后打印出来。(赋值到其他数组打印,for打印循环打印都可以的吧?)这个和循环语句有啥区别啊?干啥能用到这个递归函数啊?

18652179116
学分:750 LV7
2021-04-12
板凳

老师啊,我还有问题,别打我哈05行的代码char类型的直至数组变量cnames[]这个数组的地址传递给了22行的cnamearray这个指针的指针变量(这个cnamearray指针变量其实存储的是cnames[]数组的首地址,我理解的应该是对的吧)。然后往下的23行-31行是判断输出。从24行往下走,if中*cnamearray的值==end,程序return;那显然*cnamearray存储的地址是cnames[]数组的首地址。我的理由是:因为程序这是第一次判断啊,并且“end”得是*cnamearry+5之后的地址的值才能是“end”啊。那为什么第一次数出来的结果是“ken”而不是"Aaron"?我不知道我有没有理解错误,还是这个*cnamearry的地址+1是倒着往低来的?
老师啊,耽误您几分钟,给带问好的解答一下被,跪求了

18652179116
学分:750 LV7
2021-04-13
地板

image.png

老师,我打印了地址看了一下,为什么不是连续的啊?

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

你好:

    指针+1和数组加1可不一样, 指针加1是加一个数据类型大小个单位 比如定义的是int *p,例如此时p的地址是1452692,p+1之后的地址就会变成1452696 差4 

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

18652179116 发表于2021-04-12 22:19

老师啊,我还有问题,别打我哈05行的代码char类型的直至数组变量cnames[]这个数组的地址传递给了22行的cnamearray这个指针的指针变量(这个cnamearray指针变量其实存储的是cnames[]数组的首地址,我理解的应该是对的吧)。然后往下的23行-31行是判断输出。从24行往下走,if中*cnamearray的值==end,程序return;那显然*cnamearray存储的地址是cnames[]数组的首地址。我的理由是:因为程序这是第一次判断啊,并且“end”得是*cnamearry+5之后的地址的值才能是“end”啊。那为什么第一次数出来的结果是“ken”而不是"Aaron"?我不知道我有没有理解错误,还是这个*cnamearry的地址+1是倒着往低来的?
老师啊,耽误您几分钟,给带问好的解答一下被,跪求了

这个问题 你可以在vs2019中按f11逐语句运行 然后你就能看出来程序是怎么运行出来的了 

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

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

你好:

    指针+1和数组加1可不一样, 指针加1是加一个数据类型大小个单位 比如定义的是int *p,例如此时p的地址是1452692,p+1之后的地址就会变成1452696 差4 

老师啊,我这么多问题呢,就回答一个啊

指针的+1我知道了,什么类型的指针+1之后就是在地址上+sizeof(类型)。

可是我还有很多问题的啊,老师

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

18652179116 发表于2021-04-12 21:49

老师,还是这个实列,还有问题,我持续看了好几遍,先不去管按个**指针的指针,就单纯的看第30行代码,又回到了22行去了对吗?也就是相当于是数组下标+1了,然后打印出来。(赋值到其他数组打印,for打印循环打印都可以的吧?)这个和循环语句有啥区别啊?干啥能用到这个递归函数啊?

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

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

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

老师啊,我这么多问题呢,就回答一个啊

指针的+1我知道了,什么类型的指针+1之后就是在地址上+sizeof(类型)。

可是我还有很多问题的啊,老师

都回复了 3个

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

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

这个问题 你可以在vs2019中按f11逐语句运行 然后你就能看出来程序是怎么运行出来的了 

老师,这个我昨天已经逐句F11了。看到程序跑的过程着实没有见过。尤其是递归函数调用那块的。
直接说我不明白的吧:为什么打印的时候是倒着打印的?

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

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

老师,这个我昨天已经逐句F11了。看到程序跑的过程着实没有见过。尤其是递归函数调用那块的。
直接说我不明白的吧:为什么打印的时候是倒着打印的?

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

首页上一页 12 下一页尾页 18 条记录 1/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经营性网站备案信息 营业执照