函数指针的分析

来源:互联网 发布:淘宝能寄到印尼吗 编辑:程序博客网 时间:2024/06/14 11:57

第一点:函数指针分析

 

所谓函数指针,就是一种指向函数的指针。

其本质,还是一个指针。所以其定义方式类似于指针,但是仍旧有一些不一样。

当以方式如下:

void (*a)(int m,int n);

上述代码,意思是定义了一个函数指针,无返回值,即返回值为void,有两个形式参数,分别为int m,int n。

函数指针,只能指向与定义形式一致的函数。

例如有个函数如下:

void function1(int a1,int a2)
{
 int a3;
 a3 = a1 + a2;
 printf("a1'value is %d, a2's value is %d, the sum of a1 and a2 is a3,and the value of a3 is %d\n",a1,a2,a3);
}

那么,函数指针a,就可以赋值了,如下代码所示:

a = function1;

假如有一下函数定义:

void f3()
{
 printf("this is function f3\n");
}

那么,函数指针a就不可以赋值操作:a = f3;代码就是错误的。因为指针a的形式,与函数f3的形式不一致,即可以认为是数据类型不一致。

 

第二点:函数指针数组的定义

 

所谓函数指针数组,其本质,如字面意思,就是一个数组,但里边存储的确实指向函数的指针。

定义方式如下:

void (* f[3])(int a,int b);

其中,void 表示返回值的类型。f表示函数指针数组的变量名。3表示数组的大小。最后的(int a,int b),表示形式参数列表。其他类型的定义方法可以参照此格式。

示例如下:

void (* f[3])();

上述代码,定义了一个函数指针数组,大小为3,没有返回值,没有形式参数。

现定义函数原型:

void f1()
{
 printf("this is function f1\n");
}
void f2()
{
 printf("this is function f2\n");
}
void f3()
{
 printf("this is function f3\n");
}

下面,进行函数指针数组的赋值操作:

 f[0] = f1;
 f[1] = f2;
 f[2] = f3;

即用函数的函数名,给函数指针赋值。其实,函数的函数名,就是该函数的入口地址。

操作的时候,就可以像正常函数一样操作。如下提示:

while(1)
 {
  printf("input the num:");
  scanf("%d",&num);
  f[num]();  
 }

 

注意一点,就是,操作的时候,毕竟是个函数指针,所以,有时候,很容易把()这个括号忘掉,这样的话,调用的就不是函数了。另外,还要注意不要越界。否则,容易操作内存操作错误。造成程序终止。

0 0