指標陣列和陣列指標詳解

2021-06-25 15:03:46 字數 1950 閱讀 7155

指標陣列和陣列指標

1.定義

int *p[4]; //定義了乙個指標陣列p,p一共有4個單元,每個單元都是乙個int型的指標

int (*p)[4]; //定義了乙個陣列指標p,p可以指向乙個擁有4個單元的int型陣列

2.指標陣列的用法

#include

int main()

程式輸出:1 2 3 4

分析:指標陣列的用法比較簡單,注意一點*p[0]和*(p[0])是一樣的,因為在c語言中的優先順序要高於*運算子。

3.陣列指標的用法

陣列指標的用法比較複雜,理解相對來說也比較困難,還是需要結合一些實際的例子來一步步的理解。

例子1:

int main()

;int *p = a;

printf("%d\n", p[2]);

return 0;

}程式輸出結果:3

分析1:這是平時在寫程式時經常用到的一種寫法,但是卻隱藏著一些知識點可能平時都沒有太注意到。這裡p是乙個int型的指標,然而在程式中卻將p類似於陣列來使用,這個怎麼理解呢?其實這樣寫的話,就相當於將p單元中的值(因為要是p這樣的寫法相當於把p由普通指標公升級為乙個指標陣列,然而p[0]的值其實也就是*p的值)作為基址[2]表示的是相對於基址的偏移,這裡是偏移兩個p指向型別的單元,也就是得到的a的第三個單元(單元從1開始計數)的值也就是3。同時記住:a的理解有兩種:第一種a表示這8個int單元的總稱,體現在&a的時候,這個時候&a的型別為int (*)[8];第二種理解a的值代表的是乙個int型別的指標,體現在a[1]=*(a+1)這種操作中。

例子2#include

int main()

;int (*p)[8] = &a;

printf("%p  %p ", p, a); //這裡是用的a的值,所以a體現的是指標的性質

printf("%d ", ((*p)[3]));

printf("%d\n", *p[3]);

return 0;

}程式輸出:0012ff60 0012ff60 4 1245120

分析2:可以看到p和a的值輸出是一樣的,但是要記住這裡的p和a的型別可是完全不一樣的,所以在賦值的時候沒有直接將a賦值給p而是用了&a。這裡的a是乙個int型別的指標,而p是乙個int (*)[8]型別的指標,兩者直接賦值編譯器會報錯。第3個輸出的數為4,也就是a[3]的值,但是第四個輸出的數明顯是乙個錯誤的資料,同時記住不一定每次都是這個數。這個如何理解呢?p是乙個陣列指標,所以*p代表的才是a(儘管它們值是一樣的),然而由於的優先順序高於*,所以((*p)[3])才可以取到a[3]的值。然而p[3]根據上面的理解,是以p單元中的值為基址,偏移3個p指向的單元,然而p此時指向的是陣列,所以p指向的是乙個8個int單元的陣列,所以p[3]表示的就是記憶體區域往後的第4個陣列(每個陣列擁有8個int單元)的首位址,*p[3]取到的就是第四個陣列的第乙個單元的值,雖然這樣操作越界了,但是編譯器檢查不出來。

例子3:乙個更加複雜的例子

#include

int main()

程式輸出:56 40 2240

分析3:這個輸出可能乍一看確實比較奇怪,但是認真分析的話還是可以得到正確結果的。首先看for迴圈的賦值語句,p陣列乙個3*4*5=60個單元,而這個for迴圈分別將這60個單元依次賦值為0~59。再看p[1][7][1],操作越界了這個很明顯,但是來分析一下這個具體取的是哪個單元的值:1*20+7*5+1=56,也就是說相當於取的是q[56]的值,這個值就是56。比較難理解的就是(*(s+1)[3]),不過根據前面的講解,理解這個也是不難的,s是乙個int (*)[5]型別的指標,所以s+1就會指向下乙個陣列(每個陣列包含5個int單元),s+1的值也就相當於是&p[1][1]了,然而運算相當於將前面的作為基址進行偏移,偏移3個單元(每個單元又是乙個陣列),所以就相當於&p[1][4],然而由於p的第二維只有最多3的下標,所以更為準確的說法就是&p[2][0],然後取這個位址的值,也就是取p[2][0][0]的值,這個值就是40。

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...

指標陣列和陣列指標

該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...