C语言指针---指向函数的指针

来源:互联网 发布:vscode great icons 编辑:程序博客网 时间:2024/04/29 10:31

C语言指针—指向函数的指针

1.什么是函数指针

在程序中定义了一个函数,在编译时,系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针

一般形式:
类型名 (*指针变量名)(函数参数表列)
例如:
int (*p)(int int)
定义p是一个指向函数的指针变量,它可以指向函数的类型为整型且与两个整型参数的函数。p的类型用int(*)(int,int)表示。


2.函数指针变量的应用

(1)用函数求整数a和b的大者

#include<stdio.h>int max(int x,int y){    int z;    if(x>y)    {        z=x;    }    else    {        z=y;    }    return (z);}int main(){    int (*p)(int ,int);    //定义指向函数的指针变量    int a,b,c;    p=max;                 //使p指向max函数    printf("please enter a and b:\n");    scanf("%d,%d",&a,&b);    c=(*p)(a,b);          //通过指针变量调用max函数    printf("a=%d\nb=%d\nmax=%d\n",a,b,c);    return 0;}

程序分析:

  1. “int()p(int int);”用来定义一个指向函数的指针变量。注意(*p)两侧的括号不能省略,表示p先与*结合,是指针变量,然后再与后面的()结合,()表示函数,即该指针变量不是指向一般的变量,而是指向函数。
    如果写成了“int p(int int)”,由于()优先级高于*,它相当于“int*(p(int int)),就成为声明一个p函数了
  2. 赋值语句“p=max”的作用是将函数的入口地址赋给指针变量p,p就是指向函数max的地址。即c=(*p)(a,b);和c=max(a,b)等价。

(2)利用一个函数实现多个函数的功能

问题:有两个整数a和b用户输入1,2或3。如输入1,,程序就给出a和b中的大者;如输入2,程序就给出两者中的小者;如输入3,程序就给出a和b的和。

#include<stdio.h>int main(){    int fun(int x,int y,int (*p)(int,int));    int max(int,int);    int min(int,int);    int add(int,int);    int a=34,b=-21,n;    printf("please choose 1,2or3:  ");    scanf("%d",&n);    if(n==1)    {        fun(a,b,max);    }    if(n==2)    {        fun(a,b,min);    }    if(n==3)    {        fun(a,b,add);    }    return 0;}int fun(int x,int y,int(*p)(int,int))  //定义fun函数{    int result;    result=(*p)(x,y);    printf("%d\n",result);        //输出结果}int max(int x,int y)            //定义max函数{    int z;    if(x>y)    {        z=x;    }    else    {        z=y;    }    printf("max=");    return (z);          //输出两者中的大值}int min(int x,int y)      //定义min 函数{    int z;    if(x>y)    {        z=y;    }    else    {        z=x;    }    printf("min=");    return(z);          //输出两者中的小值}int add(int x,int y)    //定义add函数{    int z;    z=x+y;    printf("min=");    return(z);        //返回值是两数中之和}

运行结果:

  1. 若输入1
    please choose 1,2or3: 1
    max=34
  2. 若输入2
    please choose 1,2or3: 2
    min=-21
  3. 若输入3
    please choose 1,2or3: 3
    add=13

程序分析:

在定义fun函数时函数首部用“int(*p)(int,int)”声明形参p是指向函数的指针。调用fun函数时,函数名min,max,add,作为实参将其入口地址传送给fun函数中的形参p。


3.指针变量使用说明

(1)定义指针变量只能指向定义时指向的函数。如前面的“int (*p)(int ,int );“表示指针变量p只能指向返回值为整型且有两个整型参数的函数。然后把那个函数名赋给函数名即可。

(2)如果要用指针点调用函数,必须使指针变量指向该函数。如:
p=max;
这就把max函数的地址赋给指针变量p.

(3)再给函数指针变量赋值时,只需给出函数名而不必给出参数。如:
p=max;
因为只是赋地址,若“p=max(a,b)”为函数的调用,故错误。

(4)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),
在(*p)之后的括号中根据需要写上实参。例如:
c=(*p)(a,b);

(5)对指向函数的指针不能进行算术运算,如:p+n,p++。


4.指向函数的指针应用条件:

  • 通常通过编写一个通用的函数来实现各种专用的功能。例如第二个程序中通过输入一个数字,然后通过输入不同的值调用不同的函数,实现不同的功能。当然也可以用if语句或switch语句进行判断,调用不同的函数。但是用指针变量显得更专业。
1 0
原创粉丝点击