數組指針和指針數組和二重指針

數組指針和指針數組從字面上來看很糾結,有時候我也搞不清,分不清哪樣的是數組指針,哪樣的是指針數組。這東西就不是靠記憶的,我們採取分析加對比分層剝離的方法分析。

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的類型是指向指針的指針,二重指針。 
重要:二重指針就是指針數組指針 
分析能力是很重要的,比學到知識本身重要,我們永遠不能學完所有的知識,但我們可以提高學習的效率。 學習本身比學習更總要。


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