中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

指針數組,數組指針、指針函數,函數指針

發布時間:2020-07-25 11:38:18 來源:網絡 閱讀:1024 作者:捕風的xiao_k 欄目:編程語言



    聽到這幾個名詞不知道大家什么感受,反正我是一臉懵逼,不過我還是比較好學的,在老師的指導下,自己下去也鉆研了一下,有一些自己的見解,我想在學習過程中也有童鞋遇到了相同的問題,希望我的總結能給你帶來幫助。


   首先我們先明確一下這幾個概念,知道他們都表示什么,ok,請看:

函數指針函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數

指針函數:指針函數是指帶指針的函數,即本質是一個函數。函數都有返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。

指針數組:在C語言C++語言中,數組元素全為指針的數組稱為指針數組。

一維指針數組的定義形式為:“類型名 *數組標識符[數組長度]”

數組指針數組名的指針,即數組首元素地址的指針。即是指向數組的指針


    以上這些來自百度百科,概念還是有些抽象,不知所云,估計還是不知道怎么區分。ok接下來我談下我的看法。


   按照我的理解,不管是函數指針還是指針函數,或者說數組指針指針數組,我們想看后兩個字,這兩個字就決定了這個東西的大前提。我們分別來看,對函數指針來說,首先它是一個指針,只不過它比較特殊,是一個指向函數的指針,所以它叫函數指針。說它特殊其實也不特殊,我們可以想一下我們聲明×××指針、字符指針等指針,他們是不是代表指向×××的指針、字符的指針,只是我們再定義命名時沒有注意,那么這樣我們就可以解釋函數指針了,指向函數的指針。后邊我會用代碼再解釋一下。那么對于數組指針,我們是不是可以理解了呢?就是指向數組的指針。寫道這里,我想起了上一篇博文,數組名,那么他就是一個數組指針。區別了這兩個,我們接著來看另外兩個,按照我前邊說的看后兩個字,對于指針函數,首先來說,它是一個函數,對于函數我們比較關心的有兩個比較關鍵的因素,一個是返回值,另一個是參數,這里我們涉及到的就是它的返回值。有人就會問了,那為什么不是參數,這個很好解釋,就從參數所處的位置就可以區分出來,好了言歸正傳,對于指針函數就是說函數的返回值是指針類型的,比如像我們常用的庫函數malloc(),就是指針函數。最后我們再說指針數組,前三個我都解釋,我想這個聰明大家就可以自己解釋,這里我還是在解釋一下,所謂指針數組,就是存儲指針的數組,至于指針數組是存儲什么類型的指針,就要看我們聲明什么類型的數組,就像我們聲明×××數組,存儲×××數組,浮點型數組,存儲浮點型數據。從概念上區分了清了,但是我們還是見了具體的東西,你不認識我,我不認識你,接下來我就來解決這個問題


   為什么會出現什么指針函數、函數指針等,在這里我們先要再引入c語言的運算符優先級表,這些就是由于運算符的優先級造成的。


        c語言運算符優先級表


指針數組,數組指針、指針函數,函數指針

指針數組,數組指針、指針函數,函數指針


    這里我們只關心[]、()與*的優先級,我們可以從圖中很明顯的得知[]、()的優先級高于*,因而標識符,就會首先與運算級高的結合,先結合的就決定了它的性質。ok,下來我通過代碼解釋;請看下邊的代碼:


測試代碼


#include<stdio.h>


/*

**輸出兩個×××數據的最大值

*/

int Int_Max(int a, int b )

{

    return a>b?a:b;

}


/*

**輸出兩個雙精度浮點數的最大值

*/

double Double_Max(double a,double b)

{

    return a>b?a:b;


}


/*

**定義一個指針函數

*/

int *Fun_Arry(int x, int y)              

{

    static int  arry3[5]= {0};

    int *p;

    p = arry3;

    return p;


}


/*

**定義兩個函數指針,用來間接操作剛才定義的兩個函數

*/

int (*function1)(int ,int );            

double (*function2)(double ,double );             



int main()

{

    int a = 1, b = 5;                  //聲明兩個×××數據

    double c = 3.4, d = 3.6;              //聲明兩個浮點型數據

    int arry1[5] = {0};                      //聲明一個×××數組

    int DoubleArry_1[3][2];                 

    int DoubleArry_2[3][3];

    int *lp1 = NULL, *lp2 = NULL, *lp3 = NULL, *lp4 = NULL, *lp5 = NULL;


int *arry_2[5] ;               //聲明一個指針數組,用來保存×××指針




int (*arry_3)[2];                 //聲明一個數組指針,指向一個數組

        int (*arry_4)[5];              //聲明一個數組指針,指向一個數組

        int (*arry_5)[3][3];              //聲明一個數組指針,指向一個數組



    /*

    **變量arry_3是一個數組指針,它指向一個包含2 個int 類型數據的數組,即數組指針

    **并且只能指向有兩個int類型數據的數組

    */

        arry_3 = DoubleArry_1;  

        arry_4 = &arry1;

        arry_5 = &DoubleArry_2; 



/*

**function1和function2是我們之前聲明的函數指針,用來指向函數是指針,并且由于function1聲明為int型的,所以只能指向返回值為int型的函數,

**那么對于function2函數就只能指向返回值為double型的函數,因而,下邊分別讓他們分別指向了我之前定義的兩個函數。

*/

function1 = Int_Max;

function2 = Double_Max;


/*

**arry_2是一個指針數組,按照我上文說的,那它就是用來保存指針的,

**由于我在這里聲明的為×××指針數組,所以,這里我們看到保存了我個×××指針。

*/

    arry_2[0] = lp1;

    arry_2[1] = lp2;

    arry_2[2] = lp3;

    arry_2[3] = lp4;

    arry_2[4] = lp5;


/*

**為了驗證函數指針的正確性,我做了一下測試前兩行我用函數名,

**直接調用函數,分別得到×××、浮點型的最大值。

*/

        printf("Result of origonal function---->Int_Max = %d\n",Int_Max(a,b));

        printf("Result of origonal function---->Double_Max = %f\n",Double_Max(c,d));

        printf("----------------------------------------------------------------\n");

        printf("Result of Function Pointer ----->Int_Max = %d\n",function1(a, b));

        printf("Result of Function Pointer ----->Double_Max = %f\n",function2(c, d));



    return 0;

}


運行結果測試圖



指針數組,數組指針、指針函數,函數指針


   測試代碼中我已經盡可能多的給出了注釋,我在這里再重點提一個數組指針,數組指針就是指向數組的指針,注意看代碼中我用紅色標注的部分,分別聲明了三個不同類型的數組指針,arry_3是一個指向兩個×××元素的數組的指針,并且對于此指針只能指向有兩個×××元素的數組,arry_4是一個指向5個×××元素數組的指針ok,這也將涉及到上一篇博文遺留的一個問題,數組名到底是什么。arry_5是一個指向3行3列的二維數組的指針。ok,定義完了了我們來看后邊的賦值,arry_3是一個指向兩個×××元素的數組的指針,。然后用它接收了一個二維數組名,是不是有疑問,對于arry_3,不是應該指向一個一維數組嗎?怎么把一個二維數組名給它了,首先我來告訴你,這是對的,我的上一篇博文是不是談到,數組名就是代表一個數組,其保存著該數組的首元素的地址,對于二維數組從存儲結構上來看,首元素就是一個一維數組,所以用把二維數組名賦值給arry_3,其本質是將一個一維數組賦并且只有兩個×××元素的數組的地址賦值給arry_3,我們接著來看,arry_4,我把一個一維數組的地址給它,這時arry_4就指向了一維數組arry1,再看最后一條,如果要操作二維數組,就要把二維數組名的地址給相同類型的數組指針。ok對于這幾個很麻煩的的概念,按照自己理解總結了一下,希望能幫到遇到同樣問題的你,最后我在總結一下今天寫的以及一些注意事項。


 函數指針:就是指向函數的指針。

    1、函數名就是函數的入口地址

    2、指向函數的指針就是函數指針

     使用函數指針是要達到 三同  即:1、函數返回值相同2、參數個數相同3、參數對應的類型相同

    3、其他類型的指針均可自增自減,但是對于函數指針不允許自增自減

 指針數組:存儲指針的數組。

    1、 數組中的三值合一:數組名、數組首元素地址、數組名的地址

數組名中保存首元素的地址 《 數組名取地址 代表針對整個數組取地址》

    2、數組名取地址代表整個數組的地址   當要接收數組名的地址時就要定義一個數組類型的指針

    3、一維數組可以通過一級指針接收數組的地址,達到引用數組并操作數組的目的,

     但是二維數組卻不能通過定義二級指針來接收數組名,達到引用并操縱數組的目的。始終注意:數組名代表整個數組,然后數組名有值保存了數組首元素的地址

   4、對于二維數組,從本質上講是一個一維數組,但是每個元素是一個數組;    

 數組指針:就是指向數組的指針。

 指針函數:返回指針的函數就是指針函數。


向AI問一下細節

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

AI

阳江市| 赤峰市| 娄底市| 抚宁县| 邹平县| 保靖县| 新余市| 平原县| 鸡东县| 辽宁省| 塔城市| 大方县| 安陆市| 威宁| 海南省| 灵丘县| 保山市| 繁峙县| 宜宾市| 元氏县| 孙吴县| 九寨沟县| 宣武区| 北京市| 三原县| 左权县| 庆阳市| 赤壁市| 扎兰屯市| 宁夏| 田林县| 青阳县| 遵化市| 翁源县| 万荣县| 墨脱县| 闵行区| 炎陵县| 府谷县| 邢台市| 新建县|