c++中指向函数的指针
A pointer to function in c++
当我使用指针指向函数时,我注意到一些东西,但不理解
我这样做了:
#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相同的地址
为什么它是双向的?
据我所知,比较指针和常规变量是错误的。
函数和数组一样,在某些上下文中会衰变成指针。用&function
和function
几乎都是一样的。在你的例子中绝对是这样。这两个语句在语义上是相同的:
compare = callback;
compare = &callback;
call(&callback);
call(callback);
同样,当你想使用函数指针时,*
也是可选的:
x = cpmpare();
x = (*cpmpare)();
C语言委员会决定(因为含义明确),函数名(后面没有调用函数的双亲)的求值为函数的地址(就像数组名的求值为数组开头的地址一样)。
官方措辞是(§C99, 6.3.2.1/4):
函数指示符是具有函数类型的表达式。除非它是sizeof操作符的操作数或一元&操作符,带的函数指示符类型"函数返回类型"转换为类型"指针指向"的表达式函数返回类型" .
虽然我不确定Bjarne或c++委员会是否对这个想法如此兴奋,但他们显然决定支持这个想法,所以c++也是如此。我认为他们对此不感兴趣的(主要)原因是,尽管他们可以对成员函数的名称做同样的事情,但如果成员函数后面没有父函数来调用该成员函数,他们选择不这样做——要获得指向成员函数的指针,必须使用地址操作符(&
)。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址