指針數(shù)組,數(shù)組指針、指針函數(shù),函數(shù)指針


創(chuàng)新互聯(lián)致力于做網(wǎng)站、網(wǎng)站制作,成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過(guò)標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場(chǎng)競(jìng)爭(zhēng)中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!


    聽(tīng)到這幾個(gè)名詞不知道大家什么感受,反正我是一臉懵逼,不過(guò)我還是比較好學(xué)的,在老師的指導(dǎo)下,自己下去也鉆研了一下,有一些自己的見(jiàn)解,我想在學(xué)習(xí)過(guò)程中也有童鞋遇到了相同的問(wèn)題,希望我的總結(jié)能給你帶來(lái)幫助。


   首先我們先明確一下這幾個(gè)概念,知道他們都表示什么,ok,請(qǐng)看:

函數(shù)指針:函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過(guò)該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂?。有了指向函?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。

指針函數(shù):指針函數(shù)是指帶指針的函數(shù),即本質(zhì)是一個(gè)函數(shù)。函數(shù)都有返回類型(如果不返回值,則為無(wú)值型),只不過(guò)指針函數(shù)返回類型是某一類型的指針。

指針數(shù)組:在C語(yǔ)言和C++語(yǔ)言中,數(shù)組元素全為指針的數(shù)組稱為指針數(shù)組。

一維指針數(shù)組的定義形式為:“類型名 *數(shù)組標(biāo)識(shí)符[數(shù)組長(zhǎng)度]”

數(shù)組指針:數(shù)組名的指針,即數(shù)組首元素地址的指針。即是指向數(shù)組的指針。


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


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


   為什么會(huì)出現(xiàn)什么指針函數(shù)、函數(shù)指針等,在這里我們先要再引入c語(yǔ)言的運(yùn)算符優(yōu)先級(jí)表,這些就是由于運(yùn)算符的優(yōu)先級(jí)造成的。


        c語(yǔ)言運(yùn)算符優(yōu)先級(jí)表


指針數(shù)組,數(shù)組指針、指針函數(shù),函數(shù)指針

指針數(shù)組,數(shù)組指針、指針函數(shù),函數(shù)指針


    這里我們只關(guān)心[]、()與*的優(yōu)先級(jí),我們可以從圖中很明顯的得知[]、()的優(yōu)先級(jí)高于*,因而標(biāo)識(shí)符,就會(huì)首先與運(yùn)算級(jí)高的結(jié)合,先結(jié)合的就決定了它的性質(zhì)。ok,下來(lái)我通過(guò)代碼解釋;請(qǐng)看下邊的代碼:


測(cè)試代碼


#include<stdio.h>

/*

**輸出兩個(gè)×××數(shù)據(jù)的最大值

*/

int Int_Max(int a, int b )

{

    return a>b?a:b;

}

/*

**輸出兩個(gè)雙精度浮點(diǎn)數(shù)的最大值

*/

double Double_Max(double a,double b)

{

    return a>b?a:b;

}

/*

**定義一個(gè)指針函數(shù)

*/

int *Fun_Arry(int x, int y)              

{

    static int  arry3[5]= {0};

    int *p;

    p = arry3;

    return p;

}

/*

**定義兩個(gè)函數(shù)指針,用來(lái)間接操作剛才定義的兩個(gè)函數(shù)

*/

int (*function1)(int ,int );            

double (*function2)(double ,double );             

int main()

{

    int a = 1, b = 5;                  //聲明兩個(gè)×××數(shù)據(jù)

    double c = 3.4, d = 3.6;              //聲明兩個(gè)浮點(diǎn)型數(shù)據(jù)

    int arry1[5] = {0};                      //聲明一個(gè)×××數(shù)組

    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] ;               //聲明一個(gè)指針數(shù)組,用來(lái)保存×××指針

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

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

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

    /*

    **變量arry_3是一個(gè)數(shù)組指針,它指向一個(gè)包含2 個(gè)int 類型數(shù)據(jù)的數(shù)組,即數(shù)組指針

    **并且只能指向有兩個(gè)int類型數(shù)據(jù)的數(shù)組

    */

        arry_3 = DoubleArry_1;  

        arry_4 = &arry1;

        arry_5 = &DoubleArry_2; 

/*

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

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

*/

function1 = Int_Max;

function2 = Double_Max;

/*

**arry_2是一個(gè)指針數(shù)組,按照我上文說(shuō)的,那它就是用來(lái)保存指針的,

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

*/

    arry_2[0] = lp1;

    arry_2[1] = lp2;

    arry_2[2] = lp3;

    arry_2[3] = lp4;

    arry_2[4] = lp5;

/*

**為了驗(yàn)證函數(shù)指針的正確性,我做了一下測(cè)試前兩行我用函數(shù)名,

**直接調(diào)用函數(shù),分別得到×××、浮點(diǎn)型的最大值。

*/

        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;

}


運(yùn)行結(jié)果測(cè)試圖


指針數(shù)組,數(shù)組指針、指針函數(shù),函數(shù)指針


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


 函數(shù)指針:就是指向函數(shù)的指針。

    1、函數(shù)名就是函數(shù)的入口地址

    2、指向函數(shù)的指針就是函數(shù)指針

     使用函數(shù)指針是要達(dá)到 三同  即:1、函數(shù)返回值相同2、參數(shù)個(gè)數(shù)相同3、參數(shù)對(duì)應(yīng)的類型相同

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

 指針數(shù)組:存儲(chǔ)指針的數(shù)組。

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

數(shù)組名中保存首元素的地址 《 數(shù)組名取地址 代表針對(duì)整個(gè)數(shù)組取地址》

    2、數(shù)組名取地址代表整個(gè)數(shù)組的地址   當(dāng)要接收數(shù)組名的地址時(shí)就要定義一個(gè)數(shù)組類型的指針

    3、一維數(shù)組可以通過(guò)一級(jí)指針接收數(shù)組的地址,達(dá)到引用數(shù)組并操作數(shù)組的目的,

     但是二維數(shù)組卻不能通過(guò)定義二級(jí)指針來(lái)接收數(shù)組名,達(dá)到引用并操縱數(shù)組的目的。始終注意:數(shù)組名代表整個(gè)數(shù)組,然后數(shù)組名有值保存了數(shù)組首元素的地址

   4、對(duì)于二維數(shù)組,從本質(zhì)上講是一個(gè)一維數(shù)組,但是每個(gè)元素是一個(gè)數(shù)組;    

 數(shù)組指針:就是指向數(shù)組的指針。

 指針函數(shù):返回指針的函數(shù)就是指針函數(shù)。

當(dāng)前題目:指針數(shù)組,數(shù)組指針、指針函數(shù),函數(shù)指針
網(wǎng)站URL:http://muchs.cn/article38/ijoppp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)響應(yīng)式網(wǎng)站做網(wǎng)站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)