我有以下代码:
#include <stdio.h>
#include <conio.h>
int fun1 (int);
int fun2 (int);
int fun3 (int);
int (*fun4) (int) = fun1; // 1
void main()
{
int (*fun4) (int) = fun2; // 2
printf ("%d\n", fun4(3));
printf ("%d\n", fun3(3));
getch();
}
int fun1 (int x)
{
return x+1;
}
int fun2 (int x)
{
return 2*x;
}
int fun3 (int x)
{
return fun4(x);
}
产生输出:
6
4
我不确定为什么会这样。
在写入// 2的行中,我们定义fun4指向fun2。所以从那时起,当我写fun4(x)时,它与写fun2(x)相同。我不确定为什么第二次打印会产生4。
有人能解释为什么会这样吗?
答案 0 :(得分:2)
所以从那以后,当我写fun4(x)时,它与写fun2(x)相同。我不确定为什么第二次打印会产生4。
没有。
int (*fun4) (int) = fun2; // 2
仅在main
范围内可见。 fun4
仅指向fun2
内main
的指针。 main
范围fun4
之外是指向fun1
的指针
当您在fun4(x)
中致电fun3
时,它等同于fun1(x)
答案 1 :(得分:1)
在您的示例fun3
调用fun4
中,fun3
的定义对本地fun4
变量一无所知。为清楚起见,赋值fun2 = fun4
是指针赋值,而不是名称赋值。当你调用这个函数时,它不会按名称搜索它,而是只用指针搜索,指定的指针是指向fun1
的指针。
答案 2 :(得分:1)
你有fun4
的两个定义,一个是本地的,另一个是全局的。
如果我们替换fun4
的定义,您的代码将如下所示:
#include <stdio.h>
#include <conio.h>
int fun1 (int);
int fun2 (int);
int fun3 (int);
int (*fun4) (int) = fun1; // 1 (global definition)
void main()
{
int (*fun4) (int) = fun2; // 2 (local definition)
printf ("%d\n", fun2(3)); //! Since fun4(local) pointing to fun2
printf ("%d\n", fun3(3));
getch();
}
int fun1 (int x)
{
return x+1;
}
int fun2 (int x)
{
return 2*x;
}
int fun3 (int x)
{
return fun1(x); //! Since fun4(global) pointing to fun1
}
注意:请参阅更改的评论
答案 3 :(得分:0)
如果你改变你的代码:
int (*fun4) (int) = fun1; // 1
void main()
{
fun4 = fun2; // 2
printf ("%d\n", fun4(3));
printf ("%d\n", fun3(3));
getch();
}
然后它会按照您的预期行事。更改位于标记为// 2
的行上。它不会在本地范围内声明名为fun4
的其他变量,而是为现有的全局fun4
分配不同的值。