【发布时间】:2014-10-10 06:21:47
【问题描述】:
我经常用java编程,最近看了一些c代码。 我遇到了这个程序,但我不知道这个指针是如何工作的。 我知道指针存储地址,但无法通过程序。 请告诉输出 8 是怎么来的?
#include <stdio.h>
int fun(int n, int * f_p) {
int t, f;
if (n <= 1) {
*f_p = 1;
return 1;
}
t = fun(n - 1, f_p);
f = t + *f_p;
*f_p = t;
return f;
}
int main() {
int x = 15;
printf("%d\n", fun(5, &x));
return 0;
}
【问题讨论】:
-
在调试器下运行并单步执行递归。
-
这太可怕了
-
@philippe lhardy:当您编写一个需要大量中间临时数据的递归函数时,这些数据不需要保存为本地上下文和/或嵌套递归调用,那么这实际上是你应该怎么做。在调用者中创建一个“全局”上下文,并通过指针参数将其传递给所有递归级别。这样,所有递归级别都将使用相同的“全局”数据,而不是在每个递归级别上一次又一次地在本地实例化该数据。这种技术将允许您减少堆栈使用并避免堆栈溢出。
-
但是,在这种情况下,它用于不同的目的:将第二个值从较低级别返回到较高级别。因此,它本身并不是真正的“上下文”。没有真正需要在所有递归级别使用相同的
x变量。 -
@AndreyT 我同意你的两个 cmets。我仍然坚持这样一个事实,即代码中的两行 cmets 可能会保存一个 SO 帖子:-)。