陣列與指標的區別

2021-07-15 07:50:51 字數 1776 閱讀 1448

乙個陣列就是乙個位址,乙個指標就是乙個位址的位址。

指標偏向於位址的處理,陣列偏向於值的處理。

陣列是連續分配一串單元,數目開始定義的時候就必須固定下來,看起來整潔,但是寫的程式是死程式,容易浪費記憶體

指標存放乙個位址值,表示指向某乙個單元,可以用指標來索引單元。陣列可以完成棧,堆,樹等等的操作,它在程式設計時候的好處是非常的靈活,在構建思路的時候有很大的靈活性。

空間分配:

陣列是靜態分配的,指標是動態分配的。

陣列分配的空間是連續的,指標分配的空間不一定連續。

陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而 不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。

指標在定義的時候,編譯器並不會為指標所指向的物件分配記憶體空間,它只是分配指標變數的空間。除非以乙個字串常量對其進行初始化。

訪問效率:對陣列記憶體是直接訪問的,訪問效率高。而對於指標是間接訪問的,訪問效率低。

在c語言中,所有非陣列形式的資料實參均以傳值形式(對實參作乙份拷貝傳遞給呼叫的函式,函式不能修改作為實參的實際變數的值,而是只能修改傳遞給他的那份拷貝)呼叫。然而,如果要拷貝整個陣列,無論是在時間上還是空間上的開銷都是很大的,而且在大多數情況下你並不需要拷貝整個陣列,只要告訴函式那個位址就可以了。

安全性:指標可以隨時指向任意型別的記憶體塊,遠比陣列靈活,但也更危險。陣列容易造成陣列越界,指標容易造成記憶體洩漏。

函式形參:

所有作為函式引數的陣列名總是可以通過編譯器轉化為指標。

標準規定,作為「型別的陣列」的形參的宣告應該調整為「型別的指標」。在函式形參定義這個特殊情況下,編譯器必須把陣列形式改寫成指向該陣列第乙個元素的指標形式。編譯器只向函式傳遞陣列的位址,而不是整個陣列的拷貝。

為什麼c語言把陣列形參當作指標

把作為形參的陣列和指標等同起來是出於效率原因的考慮。在c語言中,所有非陣列形式的資料實參均以傳值形式(對實參做乙份拷貝並傳遞給呼叫的函式,函式不能修改作為實際引數的變數的值,而只能修改傳遞給它的那份拷貝)呼叫。同樣的,函式的返回型別絕不能是乙個函式陣列,而只能是指向陣列或函式的指標。 

c語言允許程式設計師把形式引數宣告為陣列(程式設計師打算傳給函式的東西)或者指標(函式實際所接收到的東西)。編譯器知道何時形參是作為陣列宣告的,但事實上,在函式內部,編譯器始終把它當作乙個指向陣列第乙個元素的指標(元素長度未知)。這樣,編譯器可以產生正確的**,並不需要對陣列和指標這兩種情況作仔細區分。 

不管程式設計師實際所寫的是哪種形式,函式並不自動知道指標所指向的陣列共有多少個元素,所以必須要有個約定,如陣列以null結尾(字串陣列)或者另外有乙個附加的引數表示陣列的範圍(length)。 因此,很有意思的是,沒有辦法把陣列本身傳遞給乙個函式,因為它總是被自動轉換為指向陣列的指標。當然,在函式內部使用指標,所能進行的對陣列的操作幾乎跟傳遞原原本本的陣列沒有差別。只不過,如果想使用sizeof(實參)來獲得陣列的長度不正確了。因為函式內部的陣列自動蛻化成乙個指標了,對指標進行sizeof操作得到的結果是都是4。

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,...

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指...

陣列指標與指標陣列的區別

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...