找回密码
 注册帐号
查看: 1956|回复: 14

[C++] C语言:函数型指针

  [复制链接]
发表于 2009-8-27 10:12:18 | 显示全部楼层 |阅读模式
本文节选自《21天学通C语言》一书


    C程序中的函数也都是存放在代码区内的,它们同样也是有地址的。那么如何取得函数的地址呢?在前面也说过函数定义的时候实际上是定义了一个函数变量,那么是否可以将函数变量赋值给其他变量呢?回答这些问题需要涉及另外一个概念:函数型指针。按照已有的指针的知识,顾名思义,函数型指针就是指向函数的指针。如果有一个函数声明为:
int func(const int a, const int b);
    那么,此时声明的函数变量add的地址即为这个函数的地址,同时,add的值保存为这个函数的地址,这个特性与数组相似:数组变量与数组变量的地址均为数组的起始地址。而在这个函数声明中,函数类型为int (const int a, const int b)。使用该函数类型来定义一个函数型指针,其方式如下:
int (* fp)(const int a, const int b);    /* 其中,参数列表的参数名a和b可省 */
    上述语句将变量func定义为指向类型为int (const int a, const int b)的指针操作符和变量名两侧的小括号不可省,否则其含义大不相同。例如:
int * fp(const int a, const int b);
    此时,指针操作符与数据类型int结合为int型指针类型,该语句只是声明了一个fp函数,而非定义一个函数指针。为该函数型指针赋值的方式如下:
fp = func;
被赋值的函数变量的类型必须与fp的类型完全一致,包括其返回类型和每一个形参的类型。否则程序将报错。
    注意:函数型指针变量赋值时,左值与右值的类型必须完全一致。
使用函数型指针变量调用函数的方法与使用函数变量类似,得到函数地址后再带上参数列表即可。可以使用下面两种方式来调用函数:
fp(5, 6);

(*fp)(5, 6);
由于fp被赋值为函数变量func的地址,而func的值又等于其地址,所以*fp可以得到func函数的地址。因此,在调用方式上,可以粗略地将两者视为一致(实际上其后台的处理略有不同)。范例14-7演示了如何使用函数型指针来调用函数。
【范例14-7】使用函数型指针来调用函数,实现方法如示例代码14-7所示。
示例代码14-7
01    #include <stdio.h>
02   
03    int add(const int a, const int b) {            /* 定义add函数 */
04        return a + b;
05    }
06   
07    int main(void) {
08        int (*fp) (const int a, const int b);        /* 定义函数指针 */
09   
10        fp = add;                                /* 将其赋值为add */
11        printf("3 + 4 = %d", fp(3, 4));            /* 使用fp计算+ 4的值 */
12        printf("3 + 4 = %d", (*fp)(3, 4));        /* 使用*fp计算+ 4的值 */
13   
14        printf("%p", add);                        /* 输出add的值 */
15        printf("%p", &add);                        /* 输出add的地址 */
16        printf("%p", fp);                        /* 输出fp的值 */
17        printf("%p", *fp);                        /* 输出fp指向的值 */
18   
19        return 0;
20    }
【运行结果】程序运行后。
【代码解析】本程序定义了一个函数指针,并将其赋值为相应类型的函数变量add。
&#61591;    第11~12行分别使用fp和*fp的方式调用函数,从图14-12的第1~2行中可以看到它们的调用结果是一样的。
&#61591;    第14~17行输出了add的值和地址、fp的值和指向的值,从图14-12的第3~6行中可以看到它们的调用结果都是一样的。
发表于 2009-8-27 10:21:21 | 显示全部楼层
仔细学习了
发表于 2009-10-2 16:25:15 | 显示全部楼层
我是大一新生专业是计算机我们现在就学C语言~~不懂 我会 努力~~
发表于 2009-10-4 14:33:52 | 显示全部楼层
挺复杂的  不 过 还 是 先 了解 下 咯
发表于 2009-10-11 12:08:54 | 显示全部楼层
我正在学习计算机2级-C语言
  有问题多多指教
发表于 2009-10-13 18:40:48 | 显示全部楼层
好东西  先收藏 ~~
发表于 2009-11-9 22:48:43 | 显示全部楼层
真复杂呀。。。看的头晕
发表于 2009-12-16 14:33:28 | 显示全部楼层
以后还得多来这里逛逛
发表于 2009-12-30 23:55:38 | 显示全部楼层
学了N年还是搞不懂哪里指哪里,再温习一下,希望可以开窍
发表于 2010-1-23 18:22:03 | 显示全部楼层
C  我是被人征服了
发表于 2010-1-25 08:57:56 | 显示全部楼层
要是我搞懂了這個我就會其他了。可惜很那懂。很難明白
发表于 2010-2-11 16:16:49 | 显示全部楼层
  我也不是  很等  正在努力学习
发表于 2010-2-21 11:41:58 | 显示全部楼层
路过,学过的c++都几乎忘记了
发表于 2010-2-21 13:08:53 | 显示全部楼层
我正需要这些 我正在学C语言。谢谢 楼主啊。
发表于 2010-2-23 01:50:40 | 显示全部楼层
看不明白,不过希望楼主能有所突破。。。
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

QQ|Archiver|手机版|小黑屋|依人网络官方网站 ( 陕ICP备19025998号-1 )

GMT+8, 2024-12-22 21:05 , Processed in 0.056324 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表