基本功能指针误解

时间:2014-09-21 17:14:03

标签: c function pointers

我有以下代码:

#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。

有人能解释为什么会这样吗?

4 个答案:

答案 0 :(得分:2)

  

所以从那以后,当我写fun4(x)时,它与写fun2(x)相同。我不确定为什么第二次打印会产生4。

没有。

int (*fun4) (int) = fun2; // 2  

仅在main范围内可见。 fun4仅指向fun2main的指针。 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分配不同的值。

相关问题