發現好多人搞不清楚陣列和指標的區別。
陣列申明時編譯器自動分配一片連續的記憶體空間
指標申明時只分配了用於容納指標的4位元組空間
作為函式引數時,陣列引數和指標引數等價
陣列名在多數情況下可視為常量指標,其值不能改變
指標的本質是變數,儲存的值被看做記憶體中的位址。
陣列名通常情況下被作為常量指標,只能作為左值出現,
對於陣列
int a[5];
a和&的意義不同,a是陣列元素的首位址,&a是整個陣列的位址
看下面程式
#include int main()
; int *p1 = (int *)(&a + 1);
int *p2 = (int *)(a + 1);
printf("p1[-1] = %d\n",p1[-1]);//5
printf("p2[-1] = %d\n",p2[-1]);//1
}
複製上的區別:
前面說了陣列名一般只能作為左值出現,所以復值的時候只能乙個乙個來,而指標,則可直接進行
int a1[5] = ;
int a2[5];
a2 = a1; //oops
for(int i = 0;i < 5;i++)
char *p1 = "hello";
char *p2 = null;
p2 = p1; //正確,p2也指向了hello所在記憶體空間
計算記憶體空間大小的區別:
計算陣列所佔記憶體大小使用sizeof這個關鍵字,而計算字串使用
size_t strlen(const char *s);函式,這裡是好多人常出現錯誤的地方,不少人計算陣列長度喜歡用strlen看下面例子
char s1 = ;
int s2 = ;
printf("%d\n",strlen(s1));
printf("%d\n",strlen(s2));
上面兩個均不能的到正確結果,究其原因還得**
size_t strlen(const char *s)
;的實現。
size_t strlen(const char *str)
return len;
}
看了原型大家都知道上面的結果是怎麼來的了。再次強調求陣列所佔記憶體空間用sizeof關鍵字。
字串陣列和字元陣列:
char s1 = ;
char s2 = "hello";
printf("%d\n",sizeof(s1));
printf("%d\n",sizeof(s2));//printf("%d\n",strlen(s2));結果是6
結果分別是4和5,在c中並沒有字串資料型別,只是用字元陣列進行模擬,在最後以『\0』結束;
字串陣列和字串:
char s1 = "hello";
char *s2 = "hello";
s1[1] = 'h';
s2[1] = 'h'; //oops
這裡主要是有個儲存位置的問題。s2指向的乙個字串字面量,存在在唯讀**段,其值不能被修改,s1是字串陣列存在棧空間。
作為形參傳遞:
陣列名作為形參傳遞的時候是有退化的
void fun(int a[5]) <==> void fun(int a) <==> void fun(int *a)
所以在傳遞陣列的時候還需要另乙個引數,指示陣列大小。其他情況
void fun(int *a[5]) <==> void fun(int *a) <==> void fun(int **a)
void fun(int a[5][6]) <==> void fun(int a[6]) <==> void fun(int (*a)[6])
三維或更多維陣列無法使用
定義陣列使用為指標,定義為指標,使用為陣列:
定義為陣列使用為指標:
#include char str = "hello";
#include extern char *str;
int main()
定義為指標使用為陣列
#include char *str = "hello";
#include extern char str;
int main()
這兩個的形成原因是由於對陣列和指標的處理方式不同(指標是間接的,陣列是直接的)。
引用:
陣列指標和指標陣列的區別
陣列指標 也稱行指標 定義 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 該語句是定義乙個陣列指標,指向...