指標與陣列的區別

2021-04-20 14:17:46 字數 1266 閱讀 5890

以前上課的時候老師說,將陣列名作為指標來使用,一直是這樣認為。後來在論壇中看到其實是錯的,不過不明其理,十一期間在網上發現了關於陣列與指標的文章,將其翻譯了,與大家共享(對使用的**做了一點修改)。首次翻譯文章,希望大家多多指點,謝謝!!

非常感謝那些有幫助的教程,我覺得有必要發表這篇關於指標和陣列文章。不幸的是要從一些錯誤的觀念恢復有點困難。所以正確和精確的理解問題是非常重要的,可以避免進一步的誤解。

乙個陣列並不等於乙個指標。在記憶體中,它是簡單變數的序列。

當我們寫:

int array[3];

array[2]=66;

c/c++編譯器並不將array[0]看作是乙個整型數值的位址,可以直接將它作為乙個值,與下面的寫法完全一樣。

int var;

var=66;

明顯的,var不是指標,同樣的array[2]也不是指標。

但是,如果我們使用乙個指標代替陣列,對於同樣的**,不同的編譯器所生成的匯程式設計序是不同的。例如:

int *ptr = new

int[3];

ptr[2] = 66;

類似的,對於第一種**,在編譯器中沒有不同的意思。第一中**(第二行),編譯器將會進行以下的步驟來生成的**

1)轉到array[0]的下面兩個空間,並且使它等於66

在使用指標的**中,它是這樣的:

1)取得ptr[0]的值(位址)

2)給它加上2

3)將它所指向的值設為66

事實上,array、&array和&array[0]的值使相等的。但是&array是不同的型別(乙個陣列的記憶體位址而不是陣列成員)

這裡還有另外乙個例子,使得你更容易理解這篇文章。我寫了這樣的程式:獲取使用者輸入的乙個值,給它加上4,最後將結果列印出來。我用整型指標和整型變數各寫了一次。

使用整型變數:

#include

int main()

使用指標:

#include

int main()

有人認為這些程式是完全相同的嗎?

讓我們來看看它們的彙編**。首先是整型變數的:

2212: main()

使用指標彙編**

2212: main()

第19行對第32行。因此,你可以看出整數不同於「指向整數的指標」。乙個整數是儲存整數資料在記憶體空間,而乙個整型指標是儲存乙個位址的記憶體空間。當要處理乙個整數時,編譯器知道這是乙個記憶體空間的位址。我不打算解釋這些彙編**,因為這文章是針對初學者寫的,我希望保持它的簡短。

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

一 陣列指標 也稱行指標 定義 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 該語句是定義乙個陣列指標,指向...