C语言 函数指针

这里简单介绍函数指针的使用,结合几个小例子。
C语言函数指针是指向函数的指针,利用函数指针可以调用函数,也可以把函数当做参数传递。

函数指针变量的声明 跟函数的声明一致,要标明函数的指纹,即函数的参数和返回类型,声明之后函数指针变量只能指向指纹相同的函数(试了一下,并不会报错,但是应该不提倡执行指纹不同的函数吧)。声明的例子如下:
void (*funp)(int);
其中funp是一个变量名,指向这么一类函数:返回值为void,参数为一个int型。

变量的赋值 有两种方式:

void prototypeFun(int x){
    printf("print in prototype function: %d\n",x);
}
funp = prototypeFun;    //方式一
funp = &prototypeFun;   //方式二

/*下面语句输出为4198420 4198420,也就是说prototypeFun和&prototypeFun值是
相同的,既然值是相同的,赋值fp=prototypeFun,fp=&prototypeFun也就是相同的,
这也说明函数名就是一个指针,指向函数的指针*/
printf("%d %d\n",prototypeFun,&prototypeFun);   

函数指针作为函数参数,就是把函数指针传递给函数当做参数,在这之前可以先将指向特定函数指纹的函数指针定义为一种类型,当然也可以不定义,定义的方式为:
typedef void (*FunPtype)(int);
用typedef声明之后 FunPtype变为一种类型,以后就可以用这种类型声明变量了,如下:
FunPtype fp; //使用FunPtype类型定义一个变量
函数指针作为参数的例子如下:

void fun1(int x){
    printf("print in fun1: %d\n",x);
}
void fun2(int x){
    printf("print in fun2: %d\n",x);
}
void callFun(FunPtype fp,int x){    //使用函数指针类型
    printf("a function call other function  ");
    fp(x);
}
void callFun2(void (*fun)(int),int x){  //不使用类型
    fun(x);
}
callFun(fun1,40);   //直接将函数名作为参数,函数名也是函数指针
callFun(fun2,50);
callFun2(fun1,60);

完整代码如下:


#include <stdio.h>

void prototypeFun(int);     //原型函数的声明,一个函数的指纹是说函数的参数和返回类型

void (*funp)(int);          //声明一个指针变量,声明指针变量是要说明指向的函数的指纹,即参数和返回类型

typedef void (*FunPtype)(int);  //用typedef声明之后 funPtype变为一种类型,指向某种函数指纹的指针类型

FunPtype fp;    //使用FunPtype类型定义一个变量

void callFun(FunPtype,int); //函数声明
void callFun2(void (*fun)(int),int x);

void fun1(int x){
    printf("print in fun1: %d\n",x);
}

void fun2(int x){
    printf("print in fun2: %d\n",x);
}

int main(){

    prototypeFun(10);
    (*prototypeFun)(15);    //由此可以看出,函数名就是一个指针

    funp = &prototypeFun;
    funp(20);

    printf("%d %d\n",prototypeFun,&prototypeFun);   
    fp = &prototypeFun; //效果与fp=prototypeFun一致

    fp(30);

    callFun(fun1,40);   //直接将函数名作为参数
    callFun(fun2,50);
    callFun2(fun1,60);

    return 0;   
}  

void prototypeFun(int x){
    printf("print in prototype function: %d\n",x);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值