指针-指向函数的指针

1.指针函数的定义:


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



我们可以定义一个指向函数的指针变量 如 int (*p) (int,int);


用来存放着某一函数的起始位置,这就意味着此指针变量指向该函数 。



下面我们给出一个用函数指针变量调用函数的例子


例:用函数求整数a和b中的大者。


(1) 通过函数名调用函数

 

#include  <stdio.h>
int main(){
     int max(int,int);
     int a,b,c;
     printf("please enter a and b:");
     scanf("%d,%d",&a,&b);
     c=max(a,b);
     printf("a=%d\nb=%d\nmax=%d\n",a,b,c);
     return 0;
}

int max(int x, int y){
     int z;
     if(x>y)  z=x;
     else      z=y;
     return (z);

}
 

(2)通过指针变量访问它所指向的函数

 

#include <stdio.h>
int main(){
     int max(int,int);
     int (*p) (int,int);
     int a,b,c;
     p = max;
     printf("please enter a and b:");
     scanf("%d,%d",&a,&b);
     c = (*p)(a,b);
     printf("a=%d\nb=%d\nmax=%d\n",a,b,c);
     return 0;

}

int max(int x,int y){
    int z;
    if(x>y)  z=x;
     else  z=y;
     return (z);

}
 

 

2.定义和使用指向函数的指针变量


定义函数指针变量的一般形式为:


类型名 ( * 指针变量名) (函数参数表列);



下面继续通过例子来说明指向函数的指针变量的用法


例: 输入两个整数,然后让用户选择1或2,选1的调用max函数,输出二者中的大数,选2的调用min函数,输出二者中的小数。

 

#include <stdio.h>

int main(){
     int max(int ,int);
     int min(int , int);
     int (*p)(int,int);
     int a,b,c,n;
     printf("please enter a and b:");
     scanf("%d,%d",&a,&b);
     printf("please choose 1 or 2:");
     scanf("%d",&n);
     if(n==1) p = max;
     else if(n==2) p = min;
     c = (*p)(a,b);
     printf("a=%d,b=%d\n",a,b);
     if(n==1) printf("max=%d\n",c);
     else printf("min = %d\n",c);
     return 0;
}

int max(int x,int y){
     int z;
     if(x>y) z=x;
     else z=y;
     return (z);
}

int min(int x,int y){
     int z;
     if(x<z) z=x;
     else z=y;
     return (z);
}
 

3. 用指向函数的指针作函数参数


指向函数的指针变量的一个重要的用途是把函数的地址作为参数传递到其他函数。



这样,就能在被调用的函数中使用实参函数。



例:有两个整数a和b,由用户输入1,2或3。如果输入1,程序就给出a和b中大者,输入2,就能给出a和b中的小者,输入3,则求a与b之和。

 

#include <stdio.h>
int main(){
     void 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,2 or 3:");
     scanf("%d",&n);
     if(n==1) fun(a,b,max);
     else if(n==2) fun(a,b,min);
     else if(n==3) fun(a,b,add);
     return 0;
}

void fun(int x,int y,int (*p)(int,int)){
     int result;
     result= (*p)(x,y);
     printf("%d\n",result);

}

int max(int x,int y){
     int z;
     if(x>y) z=x;
     else z=y;
     printf("max=");
     return (z);
}


int min(int x,int y){
     int z;
     if(x<y) z=x;
     else z=y;
     printf("min=");
     return (z);
}



int add(int x,int y){
     int z;
     z = x+y;
     printf("sum=");
     return (z);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值