C++ 函数指针与指针函数

【函数指针】

1.     定义

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

2.     语法

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

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

3.     说明

1) 函数指针的定义形式中的数据类型是指函数的返回值的类型。

2) 区分下面两个语句:

int (*p)(int a, int b); //p是一个指向函数的指针变量,所指函数的返回值类型为整型

int *p(int a, int b); //p是函数名,此函数的返回值类型为整型指针

3) 指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这样类型的变量,它是专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。

4) 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。

如函数max的原型为:int max(int x, int y); 指针p的定义为:int (*p)(int a, int b); 则p = max;的作用是将函数max的入口地址赋给指针变量p。这时,p就是指向函数max的指针变量,也就是p和max都指向函数的开头。

5) 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。

如有如下的函数:int fn1(int x, int y); int fn2(int x);

定义如下的函数指针:int (*p1)(int a, int b); int (*p2)(int a);

p1 = fn1; //正确

p2 = fn2; //正确

p1 = fn2; //产生编译错误

6) 定义了一个函数指针并让它指向了一个函数后,对函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。

如语句:c = (*p)(a, b); //表示调用由p指向的函数(max),实参为a,b,函数调用结束后得到的函数值赋给c。

7) 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。

8) 函数指针变量常用的用途之一是把指针作为参数传递到其他函数。

4.     举例

源代码:

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. #include <conio.h>  
  4.   
  5. int max(int x, int y); //求最大数  
  6. int min(int x, int y); //求最小数  
  7. int add(int x, int y); //求和  
  8. void process(int i, int j, int (*p)(int a, int b)); //应用函数指针  
  9.   
  10. int main()  
  11. {  
  12.     int x, y;  
  13.     cin>>x>>y;  
  14.   
  15.     cout<<"Max is: ";  
  16.     process(x, y, max);  
  17.   
  18.     cout<<"Min is: ";  
  19.     process(x, y, min);  
  20.   
  21.     cout<<"Add is: ";  
  22.     process(x, y, add);  
  23.   
  24.     getch();  
  25.     return 0;  
  26. }  
  27.   
  28. int max(int x, int y)  
  29. {  
  30.     return x > y ? x : y;  
  31. }  
  32.   
  33. int min(int x, int y)  
  34. {  
  35.     return x > y ? y : x;  
  36. }  
  37.   
  38. int add(int x, int y)  
  39. {  
  40.     return x + y;  
  41. }  
  42.   
  43. void process(int i, int j, int (*p)(int a, int b))  
  44. {  
  45.     cout<<p(i, j)<<endl;  
  46. }  
  47. <span style="font-family:宋体;"></span>  

输出结果:

【指针函数】

一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。

        返回指针的函数,一般定义格式为:

        类型标识符    *函数名(参数表)

int *f(x,y);

其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。

如:char *ch();表示的就是一个返回字符型指针的函数,请看下面的例题:

【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.

#include "stdio.h"

main()

{

    char *ch(char *,char *);

    char str1[]="I am glad to meet you!";

    char str2[]="Welcom to study C!";

    printf("%s",ch(str1,str2));

}

char *ch(char *str1,char *str2)

{

    int i;

    char *p;

    p=str2
    
    if(*str2==NULL) exit(-1);

    do

    {

        *str2=*str1;

        str1++;

        str2++;

    }while(*str1!=NULL);

    return(p);

}


通过分析可得

函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,

函数指针可以用来指向一个函数。

http://www.kuqin.com/language/20080614/9502.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值