陣列和指標的區別

2021-09-30 10:51:18 字數 2438 閱讀 2756

發現好多人搞不清楚陣列和指標的區別。

陣列申明時編譯器自動分配一片連續的記憶體空間

指標申明時只分配了用於容納指標的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 該語句是定義乙個陣列指標,指向...