3

当我用指向函数的指针做某事时,我注意到了一些东西但不明白

我这样做了:

#include <stdio.h>

int callback(void)
{
   return 5;
}

void call(int (*cpmpare)(void))
{
    int x;
    x = cpmpare();
    printf("%d", x);
}

void main()
{
    int (*compare)(void);
    int *a, b;
    b = 5;
    a = &b;
    compare = callback;
    printf("%p\n", &callback);
    printf("%p\n", compare);
    call(&callback);
}

compare = &callback而我这样compare = callback做了,它也做了同样的事情,比较得到了与回调相同的地址。

为什么它是双向的?

据我所知,比较指针和常规变量是错误的。

4

2 回答 2

6

函数,如数组,在某些情况下会衰减为指针。&function使用or几乎总是相同的function。在您的示例中,情况确实如此。这两个语句在语义上是相同的:

compare = callback;
compare = &callback;

就像这两个:

call(&callback);
call(callback);

同样,当您要使用函数指针时,*也是可选的:

x = cpmpare();
x = (*cpmpare)();
于 2013-05-27T16:28:27.833 回答
4

C 委员会决定(因为含​​义明确)一个函数的名称(不跟括号来调用该函数)将评估为函数的地址(与数组名称评估的方式大致相同)数组开头的地址)。

官方措辞是(§C99, 6.3.2.1/4):

函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符或一元 & 运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式。

尽管我不确定 Bjarne 或 C++ 委员会是否对这个想法如此兴奋,但他们显然决定同意这一点,因此在 C++ 中也是如此。我认为他们对此不感兴趣的(主要)原因是,尽管他们本可以对成员函数的名称做同样的事情,而该成员函数的名称后面没有跟括号来调用该成员函数,但他们选择不这样做——以获得一个指向成员函数的指针,必须使用地址运算符 ( &)。

于 2013-05-27T16:30:08.773 回答