91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++函數指針怎么使用

發布時間:2022-08-23 14:57:13 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

今天小編給大家分享一下C/C++函數指針怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    函數指針

    為什么要使用函數指針?

    • 調用的靈活性和通用性。

    試想一下,我們在設計初期并不知道我們的函數的具體實現細節。例如,我們我們想要一個排序函數qsort,但是具體排序法則我們并不確定,是降序還是升序,采用什么算法都不清楚。這些問題是要在用戶調用這個函數的時候才能夠決定。于是調用者應該自己設計comparator函數,傳給qsort函數。

    • 便于面向對象編程。

    例如我們設計一個結構體apple。我們除了設計出蘋果的屬性比如,數量、重量、顏色外,我們還要定義關于蘋果的操作,比如,吃掉,種植,這時候我們可以使用函數指針。然后我們以后調用這個結構體的時候,可以采用a.eat(&b)的方式調用函數。

    typedef struct apple{
        int number;
        double weight;
        colorType color;
        //some operations
        bool (*eat)(struct apple*);
        bool (*plant)(struct apple*);
    }apple;

    語法

    函數地址

    函數的地址實際上就是函數名。這一點可以類比于數組。

    聲明

    要聲明指向特定類型的函數的指針,可以先編寫這種函數的原型,然后用(*pf)代替函數名。或者采用C++11 的auto也能聲明并初始化函數指針。

    double pam (int);
    //這是函數原型
    double (*pf)(int);
    //這是函數指針
    auto pn=pam;
    //定義并初始化函數指針

    使用函數指針調用函數

    double pam (int);
    //這是函數原型
    double (*pf)(int);
    //這是函數指針
    auto pn=pam;
    //定義并初始化函數指針
    pf=pam;
    pam(4);
    (*pf)(4);
    (*pn)(4);

    直接把函數地址(即函數名)賦值給函數指針就行了,注意特征標和返回類型必須相同。然后采用(*pf)(4)這樣的方式調用函數。實際上,C++也允許這樣子使用函數指針:

    pf(4);//這種形式好看且實用,但是沒有顯示出 使用函數指針調用函數
    pn(4);

    深入理解函數指針

    閱讀這一篇幅,需要您熟練掌握,C語言中的指針。

    //一些函數原型
    const double* f1(const double ar[],int n);
    const double* f2(const double *,int);
    const double* f3(const double *,int);
    //函數指針
    const double* (*p1)(const double ar[],int n)=f1;
    auto p2=f2;//感謝auto
    //調用函數
    cout<<(*p1)(av,3)<<*(*p1)(av,3);
    cout<<p2(av,3)<<*p2(av,3);
    //實際上 *p2(av,3)和*(*p2)(av,3)是一樣的。不理解的看上面內容。
    //包含3個函數指針的數組
    const double* (*pa[3])(const double *,int)={f1,f2,f3};
    //注意:
    //1、[]優先級高于* 所以這是個數組不是指針。
    //2、不能使用auto定義并初始化列表
    auto pb=pa;
    //既然已經聲明了數組,數組名就是指針,采用auto可以定義初始化指針,這是合法的。
    //調用函數
    double x=*pa[0](av,3);
    double y=*(*pb[1])(av,3);//由于[]優先級高于* 所以pb[1]是個函數指針。然后(*pb[1])就是調用函數了。
    //更加深入
    const double *(*(*pd)[3])(const double *,int) = &pa;
    //首先把函數指針的殼子去掉即 const double *(* ···)(const double *,int),然后得到(*pd)[3]這里 pd先和* 結合 再和[]結合,所以pd是個指針,這個指針指向一個數組,這個數組的元素又是函數指針。
    //是不是特別繞?
    //感謝auto
    auto pc=&pa;
    //調用
    (*pd)[0](av,3);
    //pd是指向數組的指針,則(*pd)[0]就是數組的元素,數組的元素是函數指針,所以可以采用這種方式調用函數。
    //或者采用  (*(*pd)[0])(av,3)調用函數也是等價的。
    double z=*(*pd)[0](av,3);
    //或者 采用 double z=*(*(*pd)[0])(av,3) 也是等價的

    我們對于語法的了解不能僅僅潛于認識,對于這種const double *(*(*pd)[3])(const double *,int) = &pa; 我們不光要認識,更要會使用,再次重溫一遍,我們想要一個指向數組的指針,這個數組里的元素是函數指針。

    第一步,數組元素的類型是函數指針,所以殼子要有 const double *(* &middot;&middot;&middot;)(const double *,int)

    第二步,指向數組的指針 (*pd)[3] ,由于[]比*優先級高,所以我們必須采用(),否則 *pd[3] 就是一個數組,數組的元素是指針。 第三步,結合得 const double *(*(*pd)[3])(const double *,int) = &pa

    使用typedef 簡化

    typedef const double *(* p_fun)(const double *,int);
    p_fun p1=f1;
    p_fun pa[3]={f1,f2,f3};
    p_fun (*pd)[3]=&pa;

    typedef 使得代碼量減少很多,而且更容易理解

    以上就是“C/C++函數指針怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    策勒县| 马龙县| 武城县| 获嘉县| 陵川县| 石城县| 淅川县| 建德市| 涡阳县| 山阴县| 沈丘县| 土默特左旗| 灌云县| 临江市| 卢湾区| 调兵山市| 金秀| 丰县| 运城市| 三原县| 保靖县| 吐鲁番市| 郸城县| 蒲城县| 宝山区| 嘉祥县| 岳普湖县| 黄浦区| 临澧县| 康保县| 文山县| 榆社县| 定西市| 水富县| 揭东县| 德安县| 山东| 二连浩特市| 江源县| 石景山区| 历史|