二維數組與數組指針

上次梳理了二維數組的原理,那麼,二維數組與哪種類型的指針相似呢?

就是數組指針

數組指針爲一個指向數組整體的指針,看似是隻有它孤零零的一個指針,其實不然,除了這個指向數組整體的指針之外,還有數組內嵌的指針存在,同樣有點“我主外,你主內"的感覺。

對“我”的運算呢是數組整體地址偏移,對“你”的運算呢是數組內元素的地址偏移,這和二維數組的原理是一樣的。

不過不能隨意定義數組指針,數組指針所指數組的單位長度是有要求的。

值得注意的是,若想要用數組指針來指向二維數組時,必須設置數組指針所指數組的單位長度與二維數組的內層一維數組的單位長度相同纔可以。

爲指針賦值時,注意一定要給與指針地址!只能是地址!

例如:定義一級指針 並 賦值

一級指針需要指向(存儲)數據的地址。

    int num = 520;    //定義整形數據元素num 並賦值爲520
    int *p ;    //定義一級指針p
    p = #    //將數據元素num的地址賦值給一級指針p
    int *p;    //定義數據類型爲整形的一級指針p
    p = &a[1];    //將一維數組a的首地址賦值給指針p

 二級指針需要指向(存儲)一級指針的地址。

    char **q;    //定義二級指針q   
    p = &p;     //將一級指針p的地址賦值給二級指針q

我們再來定義一個存放字符串地址的指針數組:

    char *tBooks[] = {    //定義一個存儲了字符串地址的指針數組
            "《數據結構》",  
            "《計算機組成原理》",                
            "《C語言程序設計》",
            "《哆啦A夢》"
        };

這個指針數組較爲特殊,他的每個指針元素保存的地址是字符串的的地址,而字符串的地址就是一個字符串的內嵌指針,所以他保存的地址不是數據元素的地址,而是指針的地址,即它(指針元素)指向指針,是一個二級指針,而指向它的數組的內嵌指針是一個三級指針。

如果我們要定義一個二級指針 target;

我們應該把誰的值賦給**target呢?

    char **target;    //定義二級指針target           
    target = &tBooks[3];  //將指針數組中存放的字符串地址的二級指針元素的地址賦值給二級指針target

先記住:二級指針指向(存取)一級指針的地址!始終存取的是下一級指針的地址!!

以下是對於賦值操作的解釋:

上面雖然定義的是指針數組,但是數組內指針指向(存儲)的是字符串地址,字符串地址本身就是內嵌的字符指針,所以,指針數組裏面的指針實際上是二級指針,即取得數組元素Books[3](本質上是數組內嵌指針的運算)後得到的是什麼呢?得到的是地址!是字符串的地址,字符串地址就是一個字符串指針,是直接指向數據元素的指針,是一級指針,存取這個字符串指針的地址的是數組的指針元素,所以我們需要它的(二級指針)的地址,我們使用取址符&對其取址。

記住&tBooks[0]與&tBooks的區別,對此題目來講,&tBooks取得數組內嵌指針的地址,數內嵌指針是三級指針,&tBooks[0]取得數組第1個指針元素的地址,第一個指針元素是二級指針,他們雖然取得數值相同,代表意義不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章