陣列和指標的區別(持續更新 )

2021-08-17 10:26:24 字數 1714 閱讀 7450

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

指標:可以指向任意型別的記憶體區域,它的特徵是「可變」。

2. 修改內容

例子一:

char a = "hello";

a[0] = 'x';

cout << a << endl;

char *p = "world";          // 注意p指向常量字串

p[0] = 'x';                       // 編譯器不能發現該錯誤

cout << p << endl;

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

3. 計算容量

例子一char a = "hello world";

char *p = a;

cout << sizeof(a) << endl;   // 12位元組

cout << sizeof(p) << endl;   // 4位元組

例子二void func(char a[100])

cout << sizeof(a) << endl;   //4位元組,而不是100位元組

}分析: 用運算子sizeof可以計算出陣列的容量(位元組數)。sizeof(a) 的值是 12(注意別忘了'\0')。指標p指向a,但是sizeof(p) 的值卻是 4 。這是因為sizeof(p) 得到的是乙個指標變數的位元組數。相當於sizeof(char*)。而不是p所指向的記憶體容量。 c++/c語言沒有辦法知道指標所指向的記憶體容量。除非在申請記憶體時記住它。

注意:當陣列作為函式引數進行傳遞時,該陣列自動退化為同型別的指標,不論陣列a的容量是多少,sizeof(a)始終等於sizeof(char*)。

4. 內容複製和比較

例子一// 陣列

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(b, a) == 0);     // 不能用 if (p == a)

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

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

陣列指標和指標陣列的區別

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