在c語言中,指標與陣列之間的關係十分密切,任何通過陣列下標能完成的操作都可以用指標來實現。一般來說,用指標實現的操作會比用陣列下標完成的操作快一些;但另一方面,用指標實現的程式理解起來稍微困難一些。
宣告int a[10];
定義了乙個長度為10的陣列,換句話說,它在記憶體中開闢了一塊連續的空間用來存放10個元素:a[0],a[1],…,a[9]。其中a[i]表示陣列中的第i個元素。如果pa被宣告為乙個指向整數型別的指標,那麼語句
pa= &a[0];
則將pa指向了陣列a中的第0個元素a[0],也就是說,pa的值為a[0]的位址。這樣一來,賦值語句
x= *pa;
將會把陣列元素a[0]中的內容複製到變數x中。
如果pa指向陣列中的某個特定元素,那麼pa + 1就指向陣列中的下乙個元素。pa + i會將指標向後移動i個位置,同樣地,pa – i會將指標pa向前移動i個位置。如果指標pa指向a[0],那麼*(pa + 1)就會引用a[1]中的內容,pa + i就是元素a[i]的位址,*(pa + i)引用的是陣列元素a[i]中的內容。無論陣列a中元素型別和陣列長度是什麼,上面的結論總是成立。
下標和指標運算之間具有密切的對應關係。根據定義,陣列型別的變數或表示式的值是該陣列首元素的位址。執行賦值語句
pa = &a[0];
後,pa和a擁有相同的值。因為陣列名所代表的就是該陣列首元素的位址,所以以上賦值語句等價於
pa= a;
對陣列元素a[i]的引用也可以寫成*(a +i)的形式。實際上在計算陣列元素a[i]的值時,c語言會先將其轉換成*(a + i)的形式然後再進行求值,因此這兩種形式是等價的。如果對這兩種等價的表示形式都加上取位址運算子&,便可以得出這樣的結論&a[i]和a + i(等價於&*(a + i))的含義是相同的。相應得,如果pa是乙個指標,那麼在表示式中也可以在它的後面加下標。pa[i]與*(pa + i)是等價的。簡而言之,乙個通過陣列和下標實現的表示式可以等價地通過指標和偏移量實現。此外,由於加法交換律的存在,*(a + i)等價於*(i + a),*(pa + i)等價於*(i + pa),所以在程式中呼叫i[a]、i[pa]與呼叫a[i]、pa[i]得到的結果相同。儘管i[a]、i[pa]這種呼叫方式的執行結果是正確的,但是會使程式的可讀性降低,應該盡量避免使用。
儘管陣列名與指標在很多地方相似,但是它們之間還是有乙個不同之處。指標是乙個變數,在c語言中語句pa = a和pa++都是合法的。但是陣列名不是乙個變數,因此,類似於a = pa和a++形式的語句是非法的。
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 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本身...