我們在初學陣列和指標的時候經常會碰到這樣的題目,要求乙個陣列的元素和,並要使用陣列,指標和函式。我們往往要呼叫乙個函式實現迴圈,並且在形參中引用乙個指標指向陣列的第乙個位址,然後用乙個整形參量做迴圈的界限,這個整形參量一般是陣列的元素個數,然後通過迴圈一次次相加。其實這種方法還沒充分利用指標,指標的靈活在於它的指向是任意的,而且指標可以當作陣列來引用,想一想,我們可以安排兩個指標做形參,乙個指向陣列的頭,乙個指向陣列的尾,然後在將頭每次迴圈是往後移一位,這種方法雖然並不會比前一種簡單,但使用指標卻更充分,
在c語言中,a[i]和*(a+i)是等價的,無論a是陣列還是指標,都沒問題。指標可以加減乙個整數,也可以把兩個指標相減,通常是兩個指向同乙個陣列的指標,意思是兩個指標所指向元素的距離。也可以用關係運算子比較兩個指標的值,前提是這兩個指標都指向相同型別的物件。遞增遞減指標還要注意乙個問題,c不會檢查指標是否仍指向陣列元素,只能保證指向陣列任意元素的指標和指向陣列後面第乙個位置的指標有效,否則是未定義的。
還有乙個注意事項是:一定不要解引用未初始化的指標。如:int *p;*p=2;這是因為最初p指向的位址是不確定的,是乙個隨機值,那麼也就不知道「2」儲存在什麼地方,這有可能導致擦寫資料或**,或者程式崩潰。建立指標時,系統只是分配了儲存指標本身的記憶體,並未分配儲存資料的記憶體。因此,在使用指標前,必須先用已經分配的位址來初始化它,或者可以使用malloc函式來分配記憶體。
此外,對於陣列需要儲存其中資料時,我們可以在陣列的前面加乙個const,從const的作用看保護陣列中的資料不被修改,當我們宣告一陣列為const的時候,則不能改變其中的值,當宣告乙個指標為const的時候,如const double *p=a,表示不能通過p來改變它所指向的陣列的值。但是可以改變p的指向。還要注意的是:把const資料或非const資料的位址都初始化為指向const的指標或為其賦值是合法的,另一方面,只能把非const資料的位址賦值給普通指標。
個人對「陣列和指標」的重點筆記(下)
關於變長陣列 vla 即陣列的一種不一樣的表現形式,通過使用變數表示陣列的維度。如 int a 4,b 5 double c a b 這就是乙個變長陣列。變長陣列必須是自動儲存類別,這就意味著無論在函式中宣告還是作為函式的形參宣告,都不能使用static或者extern儲存類別說明符,而且不能在宣告...
對陣列指標的理解
整型陣列 int a 5 整型指標int p 可以存放其元素位址來進行指標訪問 字串陣列char str 5 10 該怎麼通過指標訪問其中的字串元素?字串是個陣列,所以要用陣列指標 p 即指向乙個什麼型別的陣列的指標 這是乙個寬度為10的字元陣列 所以需要 乙個寬度10的字元陣列的指標。即char ...
對陣列和指標的思考
最近學習了一點彙編和作業系統的知識,看的過程中對陣列和指標有了一些不同的新的認識,陣列到底是什麼。先貼 看看現象 段1 include void main 段2 include void main 這兩段 在vs2015和code blocks上編譯均沒有錯誤。段1在vs上甚至會有執行結果輸出!結果...