陣列和指標的區別

2021-07-05 01:47:18 字數 1658 閱讀 8154

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