C語言結構體中的函數指針


這篇文章簡單的敘述一下函數指針在結構體中的應用,為后面的一系列文章打下基礎

本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in-c-struct.html,轉載請注明源地址。

引言

指針是C語言的重要組成部分, 於是深入理解指針並且高效地使用指針可以使程序員寫出更加老練的程序。我們要記住指針是一個指向內存地址的變量。指針可以引用如int、char……常見的數據類型,例如:

int * intptr;     // 聲明一個指向整型值的指針 
int intval = 5 ;  // 定義一個整型變量 
intptr = & intval ; // intptr現在包含intval的地址

指針不僅僅指向常規的類型還可以指向函數

函數指針

函數指針的內容不難理解,不再贅述,參見《C語言函數指針的用法

語法

要聲明一個函數指針,使用下面的語法:

Return Type  * function pointer's variable name ) ( parameters 

例如聲明一個名為func的函數指針,接收兩個整型參數並且返回一個整型值

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

可以方便的使用類型定義運用於函數指針:

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

結構體中的函數指針

我們首先定義一個名為Operation的函數指針:

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

再定義一個簡單的名為STR的結構體

typedef  struct _str {
       int  result ; // 用來存儲結果
       Operation  opt; // 函數指針 

 } STR;

現在來定義兩個函數:Add和Multi:

//a和b相加
int Add (int a, int b){
    return a + b ;
}
//a和b相乘
int Multi (int a, int b){
    return a * b ;
}

現在我們可以寫main函數,並且將函數指針指向正確的函數:

int main (int argc , char **argv){
      STR str_obj;
      str_obj.opt = Add;    //函數指針變量指向Add函數
      str_obj. result = str_obj.opt(5,3);
      printf (" the result is %d\n", str_obj.result );
      str_obj.opt= Multi;    //函數指針變量指向Multi函數 
      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 

完整的代碼如下:

#include<stdio.h>

typedef int (*Operation)(int a, int b);
typedef struct _str {
    int result ; // to sotre the resut
    Operation  opt; // funtion pointer 
 } STR;

//a和b相加
int Add (int a, int b){
    return a + b ;
}

//a和b相乘
int Multi (int a, int b){
    return a * b ;
}

int main (int argc , char **argv){
      STR str_obj;
      str_obj.opt = Add;    //函數指針變量指向Add函數
      str_obj. result = str_obj.opt(5,3);
      printf ("the result is %d\n", str_obj.result );
      str_obj.opt= Multi;    //函數指針變量指向Multi函數 
      str_obj. result = str_obj.opt(5,3);
      printf ("the result is %d\n", str_obj.result );
      return 0 ;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM