函数指针、指针函数、typedef等的理解




(2014-03-05 22:02:45)
 分类: C/C 技术存档
  1. 函数指针
函数指针是指向函数的指针 变量 。因而“函数指针”本身首先应是 指针变量 ,只不过该指针变量指向函数。这正如用指针变量可指向 整型变量 、字符型、 数组 一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的 指针变量 后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的 参数
int func(int x);
void (*f) (int x);
f=func;

1.定义 函数指针类型
typedef int (*fun_ptr)(int,int);
2. 声明变量,赋值
fun_ptr max_func=max;   // fun_ptr为类型, max_func为函数指针变量

  • 指针函数
返回值 是指针的函数,即本质是一个函数。
float *f();     f是个函数,返回值是个指针,这个指针指向一个浮点数。
float (*f)();     这时,f就不是和()结合而成为一个函数名,而是和*结合成为一个指针名,这个指针,是指向函数入口的函数指针,而这个函数,返回值是浮点型。   函数指针


void (*b[10]) (void (*)());

首先,表达式的后半部分被两个()分隔开了,我们分别分析它们。( *b[10] ),其中出现了变量名b,很容易就知道,b是一个有10个元素的数组,每个元素都是一个指针。

然后,看(void(*)()),其中没有出现变量名,所以它代表了一个类型,即“指向返回值为void型的函数的指针“,而我们知道,C语法中,类型修饰符是必须出现在变量名的左边的,而在整个表达式中这个类型符是在变量名b的右边,所以, (void(*)())最外层的这个(),表示了定义了一个函数,这个函数有一个参数,就是一个指针,具体来说,就是“指向返回值为void型的函数的指针“。

这样就很清楚了,b数组里,每一个指针元素,都是一个函数指针,这个函数有一个参数,这个参数是一个函数指针。整个表达式最左边的void,则定义了b数组中函数指针所指向函数的返回值类型。


 

在面对void (*b[10]) (void (*)());时,我们可以先声明后半部分的类型:

typdef void (*pFunParam)();

即表示,类型pFunParam,是一个函数指针。

然后,针对整个表达式声明一个类型:

typedef void (*pFun)(pFunParam);

即表示,类型pFun,是一个函数指针。此函数的参数类型为pFunParam。

最后,进行变量的声明:

pFun b[10];


 

  • typedef

用途一:

定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,

// 和一个字符变量;

以下则可行:

typedef char* PCHAR;

PCHAR pa, pb;  //pa, pb都是字符指针

char* pa, pb; //pa是字符指针,pb是字符类型

这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR就不会出现这样的问题,减少了错误的发生。

http://blog.sina.com.cn/s/blog_4d8b64120101cdqr.html

函数指针百度百科:http://baike.baidu.com/view/1604730.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值