這是乙個看似簡單,但卻不是那麼容易搞清楚的問題。以下是在andrew koenig的傑作中看到的一些關於陣列和指標的講解,我只作了部分整理。
c語言中指標與陣列這兩個概念之間的聯絡是如此密不可分,以至於如果不能理解乙個概念,就無法徹底理解另乙個概念。
c語言中的陣列值得注意的地方有以下兩點:
1:c語言只有一維陣列,而且陣列的大小必須在編譯期就作為乙個常數確定下來。然而,c語言中陣列的元素可以是任何型別的物件,當然可以是另外乙個陣列,這樣啊,要「**」出乙個多維陣列就不是一件難事。(c99標準允許變長陣列(vla)。gcc編譯器實現了變長陣列,但是細節與c99標準不完全一致。)
2:對於乙個陣列,我們只能夠做兩件事:確定該陣列的大小,以及獲得指向該陣列下標為0的元素的指標。其他關於陣列的操作,哪怕他們看上去是以陣列下標進行運算的,實際上都是通過指標進行的。換句話說,任何乙個陣列下標運算都等同於乙個對應的指標運算,因此我們完全可以依據指標行為定義陣列下標的行為。一旦我們徹底理解這兩點以及他們所隱含的意思,那麼理解c語言的陣列運算不過就是「小菜一碟」。
下面乙個問題是關於指標加減問題的:
如果兩個指標指向的是同乙個陣列中的元素,我們可以把這兩個指標相減,這樣是有意義的,例如:int *q=p+i;我們可以通過q-p而得到i的值。值得注意的是如果他們指向的不是同乙個陣列的
元素,即使他們所指向的位址在記憶體中的位置正好間隔乙個陣列元素的整數倍,所得的結果仍然是無法保證其正確性的。至於指標相加的情況暫時好象沒有發現有。
現在定義乙個陣列int a[3];如果我們在應該出現指標的地方,卻採用了陣列名來替換,那麼陣列名就被當作指向該陣列下標為0的元素的指標,這點大家也都很清楚。但是要注意一點,除了a被用做運算子sizeof的引數這一情形,在其他的所有情形中陣列名a都代表指向該陣列下標為0的元
素的指標。正如我們合乎情理的期待,sizeof(a)的結果就是整個陣列的大小,而不是指向該陣列的元素的指標的大小。
下面來看看二維的情況(其他的都可以類推):
int ta[12[31];
int *p;
int i;
因為ta是乙個有著12個陣列型別元素的陣列,它的每個陣列型別元素又是乙個有著31個整形元素的陣列,所以ta[4]是陣列ta的第5個元素,是ta陣列中12個有著31個整形元素的陣列之一。因此,ta[4]的行為也就表現為乙個有著31個整形元素的陣列的行為。例如,sizeof(ta[4])的結果是31與sizeof(int)的乘積。又如:
p=ta[4];這個語句使指標p指向了陣列ta[4]中下標為0的元素。
如果ta[4]是乙個陣列,我們當然可以通過下標的形式來指定這個陣列中的元素,就像:
i=ta[4][7],與一維類似的道理,這個語句可以寫成下面這樣意思不變:
i=*(ta[4]+7);
或者:
i=*(*(ta+4)+7);
但是可以看出第一種最簡潔明瞭。
下面我們再看:
p=ta;
大家一看就知道這個語句是非法的,但具體原因是什麼呢?
因為ta是乙個二維陣列,即「陣列的陣列」,在此處的上下文中使用ta名稱會將其轉換為乙個指向陣列的指標;而p是乙個指向整形變數的指標,這個語句試圖將一種型別的指標賦值給另一種型別的指標,所以是非法的。由於我們都很熟悉陣列時針,即指向陣列的指標,所以很快就會想到乙個陣列指標int (*p)[31];
這時就可以這樣賦值:p=ta;
暫時就說到這裡了。
指標與陣列 發布日期 2006 8 28
這是乙個看似簡單,但卻不是那麼容易搞清楚的問題。以下是在andrew koenig的傑作中看到的一些關於陣列和指標的講解,我只作了部分整理。c語言中指標與陣列這兩個概念之間的聯絡是如此密不可分,以至於如果不能理解乙個概念,就無法徹底理解另乙個概念。c語言中的陣列值得注意的地方有以下兩點 1 c語言只...
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...