c++/c程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。
陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變;陣列實際上就是乙個常量指標,例如:
char ar[10]; 就相當於char * const ar; 即陣列名對應一塊空間, 該陣列名不能指向其他空間。
指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。例如:
int *pi = new int[10];
delete pi; //現在不想讓pi指向10個int空間了
pi = new int[20];
下面說明指標和陣列的幾點區別:
1、陣列和指標與記憶體空間的關係:
陣列一般在棧區開闢空間,也可以在靜態區開闢空間(全域性陣列、靜態陣列),空間的開闢與**都由編譯器或作業系統來完成,不需要程式設計師手動執行,不會產生記憶體洩露。
指標首先是乙個變數,是變數就要有儲存空間,所以指標變數一般在棧區儲存,如果說指標變數指向乙個已存在的變數,則不需開闢空間;如果說指標指向一塊動態開闢的空間,需要使用malloc或new開闢,指標變數的值儲存的是在堆上開闢空間的首位址,不再使用指標時,需使用free或delete手動釋放記憶體,否則會造成記憶體洩露。
2、修改內容:
陣列和指標雖然都可以用乙個字串來初始化,儘管看上去一樣,但底層機制卻不同。例如:
void main()
char *p;
p = ar; //只是把ar的首元素的位址賦給p
p = new char[strlen(ar)+1];
strcpy(p, ar); //可以把ar的內容拷貝到p
}
不能對陣列名進行直接複製與比較。示例2中,若想把陣列ar的內容複製給陣列br,不能用語句 br = ar ,否則將產生編譯錯誤。應該用標準庫函式strcpy進行複製。同理,比較br和ar的內容是否相同,不能用if(br==ar) 來判斷,應該用標準庫函式strcmp進行比較。
語句p = ar 並不能把a的內容複製指標p,而是把a的位址賦給了p。要想複製ar的內容,可以先用庫函式malloc為p申請一塊容量為strlen(a)+1個字元的記憶體,再用strcpy進行字串複製。同理,語句if(p==ar) 比較的不是內容而是位址,應該用庫函式strcmp來比較。
4、計算記憶體容量:
void fun(char ar)
{ cout《用運算子sizeof可以計算出陣列的容量(位元組數)。示例2中,sizeof(ar)的值是6(注意別忘了』\0』)。
指標p指向ar,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是乙個指標變數的位元組數,相當於sizeof(char*),而不是p所指的記憶體容量。c++/c語言沒有辦法知道指標所指的記憶體容量,可以把陣列長度作為乙個引數傳入函式。
注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。示例中,不論陣列ar的容量是多少,sizeof(ar)始終等於sizeof(char *)。
陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 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 該語句是定義乙個陣列指標,指向...