C語言結構體中的函數指標與函數

來源:互聯網
上載者:User

1、函數指標

一般的函數指標可以這麼定義:

int(*func)(int,int); 

表示一個指向含有兩個int參數並且傳回值是int形式的任何一個函數指標. 假如存在這樣的一個函數:

int add2(int x,int y){    return x+y;}

那麼在實際使用指標func時可以這樣實現:

func=&add2; //指標賦值,或者func=add2; add2與&add2意義相同printf("func(3,4)=%d\n",func(3,4));

事實上,為了代碼的移植考慮,一般使用typedef定義函數指標類型.

typedef int(*FUN)(int,int);FUN func=&add2; func();

2、結構體中包含函數指標其實在結構體中,也可以像一般變數一樣,包含函數指標變數.下面是一種簡單的實現.

#include "stdio.h"struct DEMO{    int x,y;    int (*func)(int,int); //函數指標};int add2(int x,int y){    return x+y;}void main(){    struct DEMO demo;    demo.func=&add2; //結構體函數指標賦值    printf("func(3,4)=%d\n",demo.func(3,4));}

上面的檔案儲存為mytest.c,在VC6.0和gcc4中編譯通過.

3、結構體中的函數
既然C++在介紹類的時候說過,類是取代結構體的。可見結構體的功能並非我們平時用到的這麼簡單,沒有太多人知道結構體中也可以有自己的函數成員。
舉個例子:

#include "stdio.h"struct DEMO{    int m;    DEMO(int k) //建構函式    {         this->m=k;        printf("after init,m=%d\n",m);     }    void func()//一般函數    {         printf("function of struct.\n");    }};void main(){    struct DEMO demo(33);    demo.func();}

儲存為mytest1.c , VC6.0和gcc編譯都會出錯。這可能說明標準C是不支援結構體包括函數成員形式的(因為尾碼.c使得VC或gcc選擇c編譯器)。 但是如果將檔案尾碼改為.cpp(也就是選擇c++編譯),就不再有錯誤了,得到結果:

after init,m=33function of struct. 

也就是說,在C++中允許結構體包含函數成員,而標準C不支援。 進一步發現,c++中甚至允許結構體中含有建構函式、重載、public/private等等.這樣看來,結構體真的與類越來越靠近相似了!

C++擴充了結構體的功能。但C++中為了介紹物件導向的類,卻淡化了同樣精彩的結構體。當我們寫一些小程式而覺得沒有必要去構造類的時候,選擇結構體確實會方便很多。

推薦相關一篇博文

http://blog.csdn.net/bit_x/article/details/5658137


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.