一般使用情况
函数指针与函数名一般使用情况:
#include <stdio.h>
void test(void)
{
printf("test\n");
}
int main()
{
void (*Fp)(); //声明一个函数指针
Fp = &test; //函数指针初始化
(*Fp)(); //函数指针解引用调用函数
test(); //函数名调用函数
return 0;
}
不一般使用情况
我在别的地方看到给函数指针赋值函数名的操作?确实没试过,试了一下竟然可以!用了那么久的C也才发现可以这样操作函数名和函数指针。
#include <stdio.h>
void test(void)
{
printf("test\n");
}
int main()
{
void (*Fp)(); //声明一个函数指针
Fp = &test; //函数指针初始化
(*Fp)(); //函数指针解引用调用函数
test(); //函数名调用函数
Fp(); //函数指针调用函数
(*test)(); //函数名解引用调用函数
return 0;
}
可以执行的原因是:函数名也属于函数指针,常规情况下函数名调用的方式是(*test)()
,但是这样有个问题,函数很多的话书写起来很不方便,于是设计者设计了可允许test()
调用。为统一起见,Fp函数指针变量也可以Fp()
的形式来调用。
函数名与函数指针的区别是:函数名test
是函数指针常量,函数指针Fp
是函数指针变量。
打印地址
打印地址看一下指针的值,确实是相同的。关于test和&test,test是函数的地址,它的类型是void ();&test表示一个指向函数test这个对象的地址,它的类型是void (*)();因此test和&test所代表的地址值是一样的,但类型不一样。
printf("%p %p %p %p %p\n",Fp, *Fp, test, *test, &test);