65.9K
CodeProject 正在变化。 阅读更多。
Home

C 结构体中的函数指针

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (13投票s)

2014年7月24日

CPOL

2分钟阅读

viewsIcon

307742

在 C 结构体中使用函数指针

介绍 


指针是 C 语言中非常重要的组成部分,因此对指针的扎实理解以及有效使用将使程序员能够编写更专业的程序。我们应该始终记住,指针是存储内存地址的变量。指针可以引用通常的数据类型,如 int、char、double 等。例如,当你输入 

int * intptr;     // declare pointer to integer value 

int intval = 5 ;  // declare integer value 

intptr = & intval ; // intptr now include the memory address of the intval

不仅是常规数据类型,指针也可以指向函数。

函数指针

函数指针是指存储函数地址的指针。由于 C 不是面向对象语言,我认为函数指针是现代语言中虚拟功能的父类。在面向对象语言中,每个驱动的 类将根据其需要实现虚拟方法。在 C 中,这与它类似,因为我们给函数指针提供所需的函数实现的地址。

语法

要声明函数指针,我们必须遵循以下语法:

返回类型       ( * 函数指针变量名 ) ( 参数 

声明一个名为 func 的函数指针,它接受两个整数参数并返回一个整数值,如下所示:

int (*func)(int a , int b ) ; 

为函数指针声明类型定义非常方便,例如:

typedef int (*func)(int a , int b ) ; 

结构体中的函数指针

C 语言中的结构体用于表示数据结构元素,例如学生数据结构。结构体可以包含来自简单数据类型和其他 来自复杂数据类型的变量。复杂数据类型,例如函数指针变量。通过提供一些简单而充分的代码来解释编程思想更容易,让我们从定义一个函数指针和一个简单的结构体开始。

我们首先定义一个名为 Operation 的函数指针,它返回一个 int 值并接受两个整数参数:

 typedef   int (*Operation)(int a , int b );

我们还有一个简单的结构体 STR,它包含指向 Operation 函数指针的指针和一个整数变量,用于存储 Operation 变量返回的值:

typedef  struct _str {

       int  result ; // to sotre the resut
       Operation  opt; // funtion pointer 

 } STR;

现在我们将定义两个函数 Add 和 Multi,它们都返回整数值并接受两个整数参数。

/*
* Add two numbers a and b 
*/

int Add ( int a , int b ){
     
      return a+b ;
}

/*
* Multiple two numbers a and b 
*/

int Multi ( int a , int b ){

       return a*b ;
}

现在我们可以编写主方法并学习如何将函数指针分配给适当的函数:

int main (int argc , char **argv){

      STR str_obj;

      str_obj.opt = Add;//the function pointer variable point to Add function 

      str_obj. result = str_obj.opt(5,3);

      printf (" the result is %d\n", str_obj.result );

      str_obj.opt= Multi;//the function pointer variable point to Multi function 

      str_obj. result = str_obj.opt(5,3);

      printf (" the result is %d\n", str_obj.result );

      return 0 ;

}

结果将是:

   the result is 8

   the result is 15 

结论

函数指针是 C 技术,它使程序员能够通过允许根据应用程序的需求执行替代函数来控制应用程序内的执行顺序。

© . All rights reserved.