您好,登錄后才能下訂單哦!
數組指針和指針數組從字面上來看很糾結,有時候我也搞不清,分不清哪樣的是數組指針,哪樣的是指針數組。這東西就不是靠記憶的,我們采取分析加對比分層剝離的方法分析。
1.概念區別
1.1.數組指針:定語在前,主語在后。也就是數組的指針。一個指針,它指向一個數組。
1.2.指針數組:定語在前,主語在后。也就是指針 的數組。一個數組,里面的元素都是指針。
2.指針和數組分別定義的符號
2.1 int * p;
分析:
第一步:找核心,核心是p。
第二步:逐層剝離,p和*結合是指針。所以int*p;是定義了一個指針
2.2. int p[5];
分析:
第一步:找核心,核心是p。
第二步:逐層剝離,p和[]結合是數組。所以int p[5];是定義了一個數組。
3.指針數組和數組指針分別定義的符號
3.1 int * p[5]
分析:
第一步:找核心,核心是p。
第二步:逐層剝離,這時候p先和[]結合還是先和*結合,查優先級表得到[]優先級更高。所以p先和[]結合成為數組。
第三步:繼續逐層剝離,p[5]這個數組再和*結合
第四步:得到結果,有一個數組有5個元素,其元素都是指針,即指針數組。
3.2. int (* p)[5];
分析:
第一步:找核心,核心是p。
第二步:逐層剝離,p和誰結合?小括號優先級更高,所以p先和*結合成為指針,
第三步:繼續逐層剝離,*p這個指針再和數組結合,
第四步:得到結果,有一個指針,該指針指向一個數組,即數組指針。
4.一維指針int * 和數組指針int (*)[]的類型匹配問題
4.1.
int * p;
int a[5];
p = a; //類型匹配嗎?
別怕,我們來分析
(1)p和結合是指針,再和int結合,說明,p是一個指向int類型變量的指針,類型為int
(2)a是數組名,a做右值表示數組首元素的首地址,首元素是int類型,首元素的地址是int*類型。
(3)得出結論,p和a類型一致。都是int*類型的。
4.2.
int * p;
int a[5];
p = & a; //類型匹配嗎?
我們再來分析
(1)p和結合是指針,再和int結合,說明,p是一個指向int類型變量的指針,類型為int
(2)a是數組名,&a做右值表示整個數組的首地址,也就是一個指向數組的指針,即數組指針,其類型為 int(*)[]
(3)第三步:得出結論,p和&a類型不匹配,p的類型是int*,&a的類型是int(*)[]
5.二維指針int * * p1;和指針數組 int*p2[5];(實際中用的比較少,如果用到二維指針肯定是和指針數組連用)
5.1.指針數組
int *p[5];
分析:
第一步:p先和[]結合是數組,再和*結合,也就是數組里面的元素都是指針,也就是說,數組中的元素,p0,p1,p2,p3,p4,都是指針,那數組名p是什么類型?
第二步:數組名p做右值時表示整個數組的首地址,整個數組都是指針,那p就是指針的指針了,即p的類型是指向指針的指針,二重指針。
重要:二重指針就是指針數組指針
分析能力是很重要的,比學到知識本身重要,我們永遠不能學完所有的知識,但我們可以提高學習的效率。 學習本身比學習更總要。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。