函数指针 和 指针函数

函数指针 和 指针函数

1、函数指针

函数指针是指向函数的指针变量,即本质是一个指针变量。

  int (*f) (int x); /* 声明一个函数指针 */

  f=func; /* 将func函数的首地址赋给指针f */

指向函数的指针包含了函数的地址,可以通过它来调用函数。声明格式如下:
     类型说明符
(*函数名)(参数)
    其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明笔削和它指向函数的声明保持一致。

        指针名和指针运算符外面的括号改变了默认的运算符优先级。如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
    例如:
       void (*fptr)() vs  void *fptr();
    
把函数的地址赋值给函数指针,可以采用下面两种形式:
        fptr=&Function;
        fptr=Function;
    
取地址运算符

&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
    可以采用如下两种方式来通过指针调用函数:
        x=(*fptr)();
        x=fptr();
    
第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:

 1 /*
 2 @Author: shaosli
 3 @data: 2016/1/5
 4 @function: 测试函数指针,PS:这里牵涉的东西稍微有点多,慢慢看,结构设计很巧妙哦。
 5 */
 6 #include <stdio.h>
 7 
 8 #define EH_RSP "send"
 9 #define EH_MSG  "reciev"
10 
11 /*声明一个函数指针*/
12 typedef void (* EHFUNCPTR)(); 
13 
14 /*定一个一个结构体*/   
15 typedef struct         
16 {
17     char *cmd;  //命令码
18     int mainType;
19     int minType;
20     EHFUNCPTR func;
21 }EH_CMD;
22 
23 void fun1(char *pBuf)
24 {
25     printf("hi,fun1=%s", pBuf);
26 }
27 
28 void fun2(char *pBuf)
29 {
30     printf("hi,fun2=%s", pBuf);
31 }
32 
33 
34 int main() 
35 {
36     char *pRecv = "lss";
37     
38     EH_CMD g_ehCmd[]=
39     {
40         {EH_RSP, 0, 0, fun1},
41         {EH_MSG, 0, 0, fun2},
42     };
43     
44     /* 这里的调用形式:(*fptr)(); */
45     (*g_ehCmd[0].func)(pRecv);   
46     
47     return 0;
48 
49 }

2、指针函数

指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针。

     类型标识符    *函数名(参数表)

     例如: int *f(x,y);

首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。下面给个例子:

float *fun();

float *p;

p = fun(a);

 

 

 

 

版权声明:本文为shaosli原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/shaosli/p/5110099.html