C--函数指针与函数名的用法

一般使用情况

函数指针与函数名一般使用情况:

#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);

猜你喜欢

转载自blog.csdn.net/Meteor_s/article/details/84103592
今日推荐