函数指针样例——CodeBlock上GNU编译器编译运行通过

函数指针的用途:

l  调用函数

l  做函数的参数

声明方法:

         数据类型标识符 (指针变量名)(形参列表)

         “()”的优先级高于”*”,故指针变量名外的括号必要的情况不可少,但不同的编译器也有不同的要求,再本文CodeBlock编译器下加括号反而报错,

不过可以根据这个思路去查找错误

下面是一个比较详细的例子源代码:

#include<stdio.h>
//声明一个函数指针
void *fun(int a,int b){
printf("Result of fun :     %d \r\n",a+b);
}
//不带指针typedef
typedef int MyFun(int,int);
//一个不带指针typedef实例
int funWithoutPointer(int a,int b){
    printf("Result function without Pointer test %d \r\n",a+b);
}

//fun1中声明一个函数指针的形参
int fun1(void (*funTest)(int,int),int b){
            funTest(b,b);                   //此处在fun1域内的函数调用名即为fun
            printf("Result of fun1:     %d\r\n",b);
            return 0;
}


//typedef声明一个函数格式
typedef int *FunPram(int a,int b);
//fun3实现一个与typedef格式相同的函数
int fun3(int a,int b)
{
    return a>b?a:b;
}
//max函数中声明的FunPram声明直接作为函数参数进行传递
void max(FunPram a,int b,int c){
    printf("Max result:        %d \r\n", a(b,c));
}


/************返回函数指针******************/
//typedef声明一个函数格式
typedef int *FunCall();
//声明满足函数指针声明的四个函数FunCall1——FunCall4
int FunCall1()
{
    return 1;
}
int FunCall2()
{
    return 2;
}
int FunCall3()
{
    return 3;
}
int FunCall4()
{
    return 4;
}
//实现一个函数指针函数其返回值为FunCall函数指针
FunCall *call_func(int a){
    switch(a){
        case 1: return FunCall1;
        case 2: return FunCall2;
        case 3: return FunCall3;
        case 4: return FunCall4;
        default: return NULL;
    }
    return NULL;
}
//定义一个返回函数指针的函数指针宏
typedef FunCall *Call_FunCall(int a);
//将返回值为FunCall函数指针的宏作为参数传入getFunCall
void getFunCall(Call_FunCall a){
    int i=1;
    for(i=1;i<=4;i++)
    printf("FunCall%d result  : %d \r\n",i,a(i)());//a(i)()二级调用返回int值
}



//主函数
int main(){
    //变量声明
    int m=0;
    void (*p)();   //声明p为函数指针
    void *pointer; //void指针
    /*********函数指针数组声明**********/
    int (*FunVector[4])();
    /*********函数指针数组的指针声明**********/
    int (*(*FunVectorPointer)[4])();
    //不带指针typedef变量声明
    MyFun *myfunction;


    p = fun;       //对函数指针p的赋值
    p(5,3);        //对函数指针p的调用

    int (*q)();     //声明一个名称为q的函数指针
    q = fun1;       //另q指针指向fun1
    q(p,10);        //运行q函数并传入函数指针p
    fun1(p,5);      //直接调用fun1运行


    //函数实体fun3传入函数max的形参当中,在其中调用函数实体fun3
    max(fun3,15,7);

    //不带指针typedef变量赋值
    myfunction = funWithoutPointer;
    //不带指针typedef函数调用
    myfunction(100,200);


    getFunCall(call_func);
    //返回主函数

    /*********函数指针数组**********/
    FunVector[0]=FunCall1;      //赋值
    FunVector[1]=FunCall2;
    FunVector[2]=FunCall3;
    FunVector[3]=FunCall4;
    for(m=0;m<4;m++)
    printf("Function Pointer Vector FunVector[%d]'s result %d:  \r\n",m+1,(FunVector[m])());

    //函数指针数组的指针
    FunVectorPointer = &FunVector;
    for(m=0;m<4;m++)
    printf("Function Pointer Vector's Pointer FunVector[%d]'s result %d:  \r\n",m+1,(FunVectorPointer[0][m])());

    /*****对(void*)指针的操作,打印void指针的大小*****/
    printf("Size of (void *)    %d  \r\n",sizeof(pointer));
    printf("Size of (void)      %d  \r\n",sizeof(*pointer));
    return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值