C语言函数指针实验

     上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体)。感叹人家的C语言功夫审核,本身费劲仍是只能读懂的份。不过,函数指针确实好用。今天就试试这个超牛的东西。Now let's see how function pointers can help us.html

实验前,了解下函数指针的定义方法。(来自百度百科的说明数组

函数指针的声明方法为: 函数

函数类型 (标志符指针变量名) (形参列表); ui

注1:“函数类型”说明函数的返回类型,“(标志符指针变量名 )”中的括号不能省,若省略总体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: url

int func(int x); /* 声明一个函数 */ spa

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

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

赋值时函数func不带括号,也不带参数,因为func表明函数的首地址,所以通过赋值之后,指针f就指向函数func(x)的代码的首地址。 htm

注2:函数括号中的形参无关紧要,视状况而定blog

第二步,准备实验环境。

   MDK473+STM32F4.其实没有必要在开发板中试,只是恰好我手上有这么个开发环境,就不去配置别的东西了。

第三步,开始写代码:

    一、写两个功能不一样参数类型同样的函数。

这里我写了两个函数:

uint8_t max1(uint8_t x,uint8_t y)
{
    return x>y?x:y;
}
uint8_t max2(uint8_t x,uint8_t y)
{
    if(x>y)
        return x;
    else
        return y;
}

       两个函数同样的功能。  

二、一个函数指针,映射其中的一个函数  看输出。以后映射到第二个函数看输出

实现步骤

int main(void)
{    
    mymax = &max1;
    mymax(3,5);
    
    mymax = &max2;
    mymax(4,6);

  while (1)
  {
  }
}

以后但不跟踪进去看看,会发现两个max函数都执行了。

        还有一种是将函数指针弄成一个数组的形式。数组的成员都是函数指针。这种写法特别适合作接口程序。好比我先前博客里边提到的Atmel的(函数指针结构体)。底层函数和上层函数分开来的效果,是当底层硬件改变以后,只写相应的接口函数就能够挂在到原来的大程序中。比从新写要简单不少。

        如下是函数指针数组的实验:

        继续使用上边的两个max函数。由于函数的返回类型是相同的,因此能够定义成数组。定义的时候只须要注意书写的格式就好了:

int main(void)
{
    uint8_t (*myFun[2])(uint8_t,uint8_t);
 myFun[0] = max1;
    myFun[1] = max2;
    
    myFun[0](2,4);
    myFun[1](5,2);
}

运行下,能够看到两个max依此都执行了。

其实函数名就是个指针,指向了函数的入口地址。函数的参数什么的,是函数名后边的一段空间,能够有也能够没有。跟这个指针没什么必然联系。

相关文章
相关标签/搜索