參考:林銳博士,高質量c/c++程式設計指南
首先對於編譯器而言,乙個陣列是乙個位址,乙個指標是乙個位址的位址。
陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而
不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。
例如:void
main(
void)
指標可以隨時指向任意型別的記憶體塊,遠比陣列靈活,但也更危險。 下表是指標和陣列乙個簡單的比較
陣列和指標的特點 陣列
指標儲存資料
儲存位址
直接訪問資料
間接訪問資料,先取得指標的內容,然後以它為位址,取得資料
用於儲存數目固定且型別相同的資料
通常用於動態資料結構
由編譯器自動分配和刪除
動態的分配和刪除,相關函式為malloc() 和free()
自身即為資料名
通常指向隱式資料
1、指標和陣列都可以在初始化的時候賦予字串常量。儘管看上去一樣,底層機制卻不同。
指標在定義的時候,編譯器並不會為指標所指向的物件分配記憶體空間,它只是分配指標變數的空間。除非以乙個字串常量對其進行初始化。下面的定義建立了乙個字串常量(為其分配了記憶體空間)
char *p = "abcd";
在ansi c中,初始化指標時所指向的字串被定義為唯讀,如果想通過指標修改字串的時候,會產生未定義的行為。
陣列也可以用字串常量進行初始化,但是其內容可以被修改。
2、內容的複製和比較
不能對陣列進行位元組複製和比較,對於兩個陣列a,b,不能用b=a進行複製,而應當使用標準庫函式strcpy()。也不能使用if(b==a)進行比較,應當使用strcmp()。
而對於指標p,如果要想將陣列a中的內容複製,要先申請一塊記憶體區域,然後使用strcpy()進行拷貝。
void
main(
void)
3、計算記憶體容量
用運算子sizeof()可以計算出陣列的容量(位元組數)。如下例
chara =
"abcdef";
char*p
=a;sizeof
(a) =7
; sizeof
(p) =4
;//sizeof(p) equal to sizeof(char *) =4
注意當陣列名作為函式引數進行傳遞時,該陣列自動退化該型別的指標,如下例:
void
test(
char
a[100])
個人觀點:本來想再寫一些關於指標和陣列的相同之處,但是我覺得對於二者討論的太多反而會讓人更加模糊二者該如何使用,陷入到理論的牛角尖中。如果大家非要搞清楚的話,可以參考《c專家程式設計》。只要我們可以正確的使用,就沒有必要太深究吧,有時候鑽的越深,反而越不知如何使用。
陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 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 該語句是定義乙個陣列指標,指向...