Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269651
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-06-17 09:31:37

【转自 http://blog.csdn.net/porscheyin/article/details/3461632 谢谢】
函数指针的声明void (*f) ( );虽然()的优先级高于*,但由于有括号存在,首先执行的是解引用,所以f是一个指针;接下来执行( ),表明f指向一个函数,这个函数不返回任何值
 eg : int *f(int ,int);

函数指针的初始化注意指向函数的指针
(函数指针)指向的是函数而非普通的变量,它所指向的函数也是有特定类型的,函数的类型由它的返回值类型以及形参列表确定,和函数名无关。对函数指针初始化时可以采用相同类型函数的函数名或函数指针(当然还有零指针常量)C语言规定函数名会被转换为指向这个函数的指针,除非这个函数名作为操作符或sizeof操作符的操作数(注意:函数名用于sizeof的操作数是非法的)也就是说f = test;test被自动转换为&test,而f= &test;中已经显示使用了&test,所以test就不会再发生转换了。因此直接引用函数名等效于在函数名上应用 & 运算符,两种方法都会得到指向该函数的指针。
 eg : int (*f)(int,int)=&test/test;

函数指针的使用通过函数指针调用函数):ANSIC标准将f ( )认为是(*f)( )的简写形式,并且推荐使用f ( )形式,因为它更符合函数调用的逻辑。要注意的是:如果指向函数的指针没有初始化,或者具有0(零指针常量),那么该指针不能在函数调用中使用。只有当指针已经初始化,或被赋值后指向某个函数才能安全地用来调用函数。
    eg : int a,b;f(a,b) / (*f)(a,b)

注意:
标准禁止对指向函数的指针进行自增运算
不能对函数名赋值,函数名也不能用于进行算术运算
函数名test,输出:test ,&test ,*test得到的都是函数入口地址。
首先来看函数名test,它与数组名类似(注意:只是类似),是一个符号用来标识一个函数的入口地址,在使用中函数名会被转换为指向这个函数的指针,指针的值就是函数的入口地址,&test在前面已经说了:显示获取函数的地址。对于*test,可以认为由于test已经被转换成了函数指针,指向这个函数,所以*test就是取这个指针所指向的函数名,而又根据函数名会被转换指向该函数的指针的规则,这个函数也转变成了一个指针,所以*test最终也是一个指向函数test的指针。对它们采用%p格式项输出,都会得到以16进制数表示的函数test的入口地址。注意函数的地址在编译期是未知的,而是在链接时确定的。


阅读(793) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~