雷火电竞-中国电竞赛事及体育赛事平台

歡迎來(lái)到入門(mén)教程網(wǎng)!

C語(yǔ)言

當(dāng)前位置:主頁(yè) > 軟件編程 > C語(yǔ)言 >

詳解C語(yǔ)言結(jié)構(gòu)體中的函數(shù)指針

來(lái)源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語(yǔ)言|點(diǎn)擊:

結(jié)構(gòu)體是由一系列具有相同類型或不同類型的數(shù)據(jù)構(gòu)成的數(shù)據(jù)集合。所以,標(biāo)準(zhǔn)C中的結(jié)構(gòu)體是不允許包含成員函數(shù)的,當(dāng)然C++中的結(jié)構(gòu)體對(duì)此進(jìn)行了擴(kuò)展。那么,我們?cè)贑語(yǔ)言的結(jié)構(gòu)體中,只能通過(guò)定義函數(shù)指針的方式,用函數(shù)指針指向相應(yīng)函數(shù),以此達(dá)到調(diào)用函數(shù)的目的。

函數(shù)指針

函數(shù)類型 (*指針變量名)(形參列表);第一個(gè)括號(hào)一定不能少。
“函數(shù)類型”說(shuō)明函數(shù)的返回類型,由于“()”的優(yōu)先級(jí)高于“*”,所以指針變量名外的括號(hào)必不可少。
 注意指針函數(shù)與函數(shù)指針表示方法的不同,千萬(wàn)不要混淆。最簡(jiǎn)單的辨別方式就是看函數(shù)名前面的指針*號(hào)有沒(méi)有被括號(hào)()包含,如果被包含就是函數(shù)指針,反之則是指針函數(shù)。
要聲明一個(gè)函數(shù)指針,使用下面的語(yǔ)法:

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

例如聲明一個(gè)名為func的函數(shù)指針,接收兩個(gè)整型參數(shù)并且返回一個(gè)整型值

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

可以方便的使用類型定義運(yùn)用于函數(shù)指針:

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

結(jié)構(gòu)體中的函數(shù)指針
我們首先定義一個(gè)名為Operation的函數(shù)指針:

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

再定義一個(gè)簡(jiǎn)單的名為STR的結(jié)構(gòu)體

typedef struct _str {
    int result ; // 用來(lái)存儲(chǔ)結(jié)果
    Operation opt; // 函數(shù)指針 

 } STR;

現(xiàn)在來(lái)定義兩個(gè)函數(shù):Add和Multi:

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

現(xiàn)在我們可以寫(xiě)main函數(shù),并且將函數(shù)指針指向正確的函數(shù):

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

運(yùn)行結(jié)果如下:

 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;  //函數(shù)指針變量指向Add函數(shù)
   str_obj. result = str_obj.opt(5,3);
   printf ("the result is %d\n", str_obj.result );
   str_obj.opt= Multi;  //函數(shù)指針變量指向Multi函數(shù) 
   str_obj. result = str_obj.opt(5,3);
   printf ("the result is %d\n", str_obj.result );
   return 0 ;
}

上一篇:簡(jiǎn)單解讀C++中的虛函數(shù)

欄    目:C語(yǔ)言

下一篇:實(shí)例解析C++中類的成員函數(shù)指針

本文標(biāo)題:詳解C語(yǔ)言結(jié)構(gòu)體中的函數(shù)指針

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2361.html

網(wǎng)頁(yè)制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語(yǔ)言數(shù)據(jù)庫(kù)服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有