函数指针和指针函数区别以及如何应用,举例说明,要如何理解他们的概念
2014-06-02 17:36
369 查看
引自百度知道http://zhidao.baidu.com/link?url=kzxsGdhS0ZjIOzG0S0dyY5GH5qc1TwRcgkZMTlM8vNJ4tqyj74oDZyIDEFF6gQZWPrpe6-9IgEav_TdyQPENia 1 函数指针变量 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。 函数指针变量定义的一般形式为: 类型说明符 (*指针变量名)(); 其中“类型说明符”表示被指函数的返回值的类型。“(* 指针变量名)”表示“*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。 例如: int (*pf)(); 表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。 【例】本例用来说明用指针形式实现对函数调用的方法。 int max(int a,int b){ if(a>b)return a; else return b; } main(){ int max(int a,int b); int(*pmax)(); int x,y,z; pmax=max; printf("input two numbers:\n"); scanf("%d%d",&x,&y); z=(*pmax)(x,y); printf("maxmum=%d",z); } 从上述程序可以看出用,函数指针变量形式调用函数的步骤如下: 1) 先定义函数指针变量,如后一程序中第9行 int (*pmax)();定义 pmax为函数指针变量。 2) 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max; 3) 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y); 4) 调用函数的一般形式为: (*指针变量名) (实参表) 使用函数指针变量还应注意以下两点: a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。 b) 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。 2 指针型函数 前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。 定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) { …… /*函数体*/ } 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。 如: int *ap(int x,int y) { ...... /*函数体*/ } 表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。 【例】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。 main(){ int i; char *day_name(int n); printf("input Day No:\n"); scanf("%d",&i); if(i<0) exit(1); printf("Day No:%2d-->%s\n",i,day_name(i)); } char *day_name(int n){ static char *name[]={ "Illegal day", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; return((n<1||n>7) ? name[0] : name ); } 本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。 应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。 int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。 int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。 对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。
相关文章推荐
- 函数指针和指针函数区别以及如何应用,举例说明,要如何理解他们的概念
- 函数指针和指针函数区别以及如何应用,举例说明
- 路由器和交换机 集线器的概念定义,以及他们三者之间的区别!
- java中this这个概念初学者非常难理解,请举例说明
- Spark Cluster与Application中的重要概念以及如何提交应用spark-submit
- 关于初学者如何理解面向对象和面向过程的区别以及java中的类和对象
- 谈谈对 ”框架“ 这个概念的理解,以及它和库的区别
- 数组指针和指针数组的区别,以及如何利用他们访问数组里面的元素
- C/S和B/S架构的概念、优缺点、应用以及区别
- 举例说明强化学习以及监督学习的区别
- 看门狗的概念与应用以及如何用软件实现系统的复位
- struts2中过滤器和拦截器的区别,以及他们所应用的事例
- 一个例子叫你理解缓冲输入与非缓冲输入,以及流的概念:论read与fget open与fopen的区别
- A/B 测试的基本概念举例理解以及具体实现方法【传统A/B测试基于后端的 A/B 测试(Back-end AB test),现在基本上基于前端js在客户端进行分流,有更多优点,请看里面】
- 工作流概念理解以及jbpm应用
- 看门狗的概念与应用以及如何用软件实现系统的复位
- 让我们清楚的理解$().each() 与 $.each()区别,以及 jquery ajax 应用
- 详解Qt,并举例说明动态编译(shared)和静态编译(static)以及debug and release 编译版本区别
- 如何通俗易懂地举例说明“面向对象”和“面向过程”有什么区别?
- 如何理解前端框架中的MVVM,MVC,MVW?他们的区别和适用场景分别是什么?