函数指针的定义,赋值,调用

http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html

void myFun(int x);    //声明也可写成:void myFun( int );

int main()

{

myFun(100);//一般的函数调用

return 0;

}

void myFun(int x)

{

printf("myFun: %d\n",x);

}

函数指针变量的声明:

void (*funP)(int) ;   //声明一个指向同样参数、返回值的函数指针变量。

(整个函数指针变量的声明格式如同函数myFun的声明处一样,只不过——我们把myFun改成(*funP)而已,这样就有了一个能指向myFun函数的指针了。当然,这个funP指针变量也可以指向所有其它具有相同参数及返回值的函数。)

#include#includevoid (*funP)(int);  //声明也可写成void(*funP)(int x),但习惯上一般不这样。

void (*funA)(int);

void myFun(int x);    //声明也可写成:void myFun( int );

int main()

{

//一般的函数调用

myFun(100);

//myFun与funP的类型关系类似于int 与int *的关系。

funP=&myFun;  //将myFun函数的地址赋给funP变量

(*funP)(200);  //通过函数指针变量来调用函数

//myFun与funA的类型关系类似于int 与int 的关系。

funA=myFun;

funA(300);

//三个貌似错乱的调用

funP(400);

(*funA)(600);

(*myFun)(1000);

return 0;

}

void myFun(int x)

{

printf("myFun: %d\n",x);

}

总结:

1、 其实,myFun的函数名与funP、funA函数指针都是一样的,即都是函数指针。myFun函数名是一个函数指针常量,而funP、funA是函数数指针变量,这是它们的关系。

2、但函数名调用如果都得如(*myFun)(10)这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许myFun(10)这种形式地调用(这样方便多了,并与数学中的函数形式一样)。

3、 为了统一调用方式,funP函数指针变量也可以funP(10)的形式来调用。

4、赋值时,可以写成funP=&myFun形式,也可以写成funP=myFun。

5、但是在声明时,void myFun(int )不能写成void (*myFun)(int )。void (*funP)(int )不能写成void funP(int )。

6、函数指针变量也可以存入一个数组内。数组的声明方法:int (*fArray[10]) ( int );

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.语言中变量的实质 要理解C指针,我认为一定要理解C中“变量”的存储实质, 所以我就从“变量”这个东西开始讲起吧...
    金巴多阅读 1,843评论 0 9
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,505评论 3 44
  • !!!注意:因为简书的显示格式缘故,所以“ * ”显示会出现问题,可能有些星号由于疏忽未改动格式,造成没有显示,请...
    Eric_Hunter阅读 724评论 0 0
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,400评论 0 6
  • 那是七十年代的事了,今天回忆起来不太清楚当时是几几年,也记不清当时的年龄,大致有十二、三岁的样子,好像还在上小学,...
    为尘阅读 349评论 1 1