7 3 指標與陣列的對比

2021-06-22 02:31:43 字數 1289 閱讀 3829

c++/c 程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。

陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。

指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。

下面以字串為例比較指標與陣列的特性。

7.3.1 修改內容

示例 7-3-1 中,字元陣列a 的容量是6 個字元,其內容為hello\0。a 的內容可以改變,如a[0]= 『x』。指標p 指向常量字串「world」(位於靜態儲存區,內容為world\0),常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句p[0]= 『x』有什麼不妥,但是該語句企圖修改常量字串的內容而導致執行錯誤。

7.3.2 內容複製與比較

不能對陣列名進行直接複製與比較。示例7-3-2 中,若想把陣列a 的內容複製給陣列b,不能用語句 b = a ,否則將產生編譯錯誤。應該用標準庫函式strcpy 進行複製。同理,比較b 和a 的內容是否相同,不能用if(b==a) 來判斷,應該用標準庫函式strcmp進行比較。

語句 p = a 並不能把a 的內容複製指標p,而是把a 的位址賦給了p。要想複製a的內容,可以先用庫函式malloc 為p 申請一塊容量為strlen(a)+1 個字元的記憶體,再用strcpy 進行字串複製。同理,語句if(p==a) 比較的不是內容而是位址,應該用庫函式strcmp 來比較。

7.3.3 計算記憶體容量

用運算子sizeof 可以計算出陣列的容量(位元組數)。示例7-3-3(a)中,sizeof(a)的值是12(注意別忘了』\0』)。指標p 指向a,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是乙個指標變數的位元組數,相當於sizeof(char*),而不是p 所指的記憶體容量。

c++/c 語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。示例7-3-3(b)中,不論陣列a 的容量是多少,sizeof(a)始終等於sizeof(char *)。

38,指標與陣列

include 陣列名就是陣列的位址,陣列的位址就是首元素的位址 所以,獲取陣列位址有兩種方式 nums 0 或nums int main int argc,const char argv int p nums int p nums 0 return0 include int main int ar...

7 3 指標作為函式的引數

乙個函式在編譯時被分配乙個入口位址,這個入口位址被稱為函式的指標。在c 中,函式名代表函式的入口位址。共有三個重點 1 指標作函式的引數 實現位址傳遞 2 返回指標的函式 3 利用指向函式的指標呼叫函式 指標作函式的引數,具有以下用途 1 指標作函式引數,這時形參接受的是實參的位址。函式中通過對指標...

指標(三) 指標陣列

指標陣列定義 一維指標陣列的定義形式 型別名 陣列名 陣列長度 char p 5 乙個陣列,若其元素均為指標型別資料,稱為指標陣列,指標陣列中的每乙個元素都相當於乙個指標變數。指標陣列的初始化 使用位址為指標陣列初始化 char p 5 指標陣列和二級指標 int main char temp 定義...