c++中指向函数的指针

A pointer to function in c++

本文关键字:指针 函数 c++      更新时间:2023-10-16

当我使用指针指向函数时,我注意到一些东西,但不理解

我这样做了:

#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("%pn", &callback);
    printf("%pn", compare);
    call(&callback);
}

我用compare = &callback代替compare = callback,它做了同样的事情,比较得到了和callback相同的地址

为什么它是双向的?

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

函数和数组一样,在某些上下文中会衰变成指针。用&functionfunction几乎都是一样的。在你的例子中绝对是这样。这两个语句在语义上是相同的:

compare = callback;
compare = &callback;

call(&callback);
call(callback);
同样,当你想使用函数指针时,*也是可选的:
x = cpmpare();
x = (*cpmpare)();

C语言委员会决定(因为含义明确),函数名(后面没有调用函数的双亲)的求值为函数的地址(就像数组名的求值为数组开头的地址一样)。

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

函数指示符是具有函数类型的表达式。除非它是sizeof操作符的操作数或一元&操作符,带的函数指示符类型"函数返回类型"转换为类型"指针指向"的表达式函数返回类型" .

虽然我不确定Bjarne或c++委员会是否对这个想法如此兴奋,但他们显然决定支持这个想法,所以c++也是如此。我认为他们对此不感兴趣的(主要)原因是,尽管他们可以对成员函数的名称做同样的事情,但如果成员函数后面没有父函数来调用该成员函数,他们选择不这样做——要获得指向成员函数的指针,必须使用地址操作符(&)。