以前上課的時候老師說,將陣列名作為指標來使用,一直是這樣認為。後來在論壇中看到其實是錯的,不過不明其理,十一期間在網上發現了關於陣列與指標的文章,將其翻譯了,與大家共享(對使用的**做了一點修改)。首次翻譯文章,希望大家多多指點,謝謝!!
非常感謝那些有幫助的教程,我覺得有必要發表這篇關於指標和陣列文章。不幸的是要從一些錯誤的觀念恢復有點困難。所以正確和精確的理解問題是非常重要的,可以避免進一步的誤解。
乙個陣列並不等於乙個指標。在記憶體中,它是簡單變數的序列。
當我們寫:
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 該語句是定義乙個陣列指標,指向...