c++/c
程式中,指標和陣列在不少地方可以相互替換著用,讓人產生一種錯覺,以為兩者是等價的。
陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。陣列名對應著(而不是指向)一塊記憶體,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。
指標可以隨時指向任意型別的記憶體塊,它的特徵是「可變」,所以我們常用指標來操作動態記憶體。指標遠比陣列靈活,但也更危險。
下面以字串為例比較指標與陣列的特性。
1 修改內容
示例1中,字元陣列a的容量是6個字元,其內容為hello\0。a的內容可以改變,如a[0]= 『x』。指標p指向常量字串「world」(位於靜態儲存區,內容為world\0),常量字串的內容是不可以被修改的。從語法上看,編譯器並不覺得語句p[0]= 『x』有什麼不妥,但是該語句企圖修改常量字串的內容而導致執行錯誤。
char a = 「hello」;
a[0] = 『x』;
cout << a << endl;
char *p = 「world」; // 注意p指向常量字串
p[0] = 『x』; // 編譯器不能發現該錯誤
cout << p << endl;
示例1 修改陣列和指標的內容
2 內容複製與比較
不能對陣列名進行直接複製與比較。示例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來比較。
// 陣列…
char a = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用 if (b == a)
// 指標…
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用 p = a;
if(strcmp(p, a) == 0) // 不要用 if (p == a)
示例2 陣列和指標的內容複製與比較
3 計算記憶體容量
用運算子sizeof可以計算出陣列的容量(位元組數)。示例3(a)中,sizeof(a)的值是12(注意別忘了』\0』)。指標p指向a,但是sizeof(p)的值卻是4。這是因為sizeof(p)得到的是乙個指標變數的位元組數,相當於sizeof(char*),而不是p所指的記憶體容量。c++/c語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。
注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。示例3(b)中,不論陣列a的容量是多少,sizeof(a)始終等於sizeof(char *)。
char a = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12位元組
cout<< sizeof(p) << endl; // 4位元組
示例3(a) 計算陣列和指標的記憶體容量
void func(char a[100])
cout<< sizeof(a) << endl; // 4位元組而不是100位元組
示例3(b) 陣列退化為指標
陣列指標與指標陣列區別
前提 陣列指標是指標 指標陣列是陣列 示例 int p1 5 和 int p1 5 前者為指標陣列 後者為陣列指標。涉及運算符號優先順序 陣列下標比取值運算子 的優先順序更高。自右向左結合。先結合陣列下標.先談指標陣列 int p1 5 指向整型資料的指標變數。0 1 2 3 4 int 結論 指標...
指標與陣列區別
1 從編譯層面看c語言中指標與陣列的區別 一 理論分析 編譯器在處理指標與陣列的時候,是區別對待的。對於指標 int p p 是乙個變數,所以編譯器要為之分配乙個空間。comm p,4 對於陣列 int a 10 a 是乙個位址,編譯器會為陣列 a 分配乙個空間,但不會為 a 本身分配空間,在使用到...
指標與陣列區別
程式1 includeint main 輸出1 a的大小10 a 1 的大小1 char p a後p大小8 char q的大小8 程式2 include include includeint main 輸出2 hello0123456789程式三 include include includeint...