「數組名至關於指針,指向數組的首個成員的地址」這種表述見過不少,但實際上,這種說法很不全面,甚至在某些狀況下是錯誤的。下面舉例來講明一下。數組
首先來看他們類似的特色:數據結構
例1. int arr[] = {1,2,3,4,5}; int * pointer = arr; printf("%d\n",arr[0]); printf("%d\n",*pointer);
上面兩句的輸出是相同的,即數組名能夠轉換成指向該數組的首地址的指針。函數
可是若是更改一下輸出語句:spa
例2. printf("%d\n",sizeof(arr)); printf("%d\n",sizeof(pointer));
結果就不一樣了,前者輸出爲20,後者輸出爲4。這裏能夠體現出數組名與指針的不一樣之處:arr表示一個數據結構的實體,其表明的含義要比指針豐富,雖然它能夠犧牲掉一些信息轉換成指針,20表示arr在內存中佔用了20個字節的空間,而pointer僅僅是個指針,佔用4個字節的空間。再來看一例:指針
例3. int getLen(int arr[]) { return sizeof(arr); } printf("%d\n",getLen(arr));
輸出爲何呢?是20麼?呵呵,錯了,應該是4。緣由在於當數組名做爲參數傳遞給函數時,其將退化爲一個指針。那爲何在例2中sizeof()接受arr爲參數時沒有發生退化呢?由於sizeof()並非一個函數,而是一個操做符。code
二者的區別還有:blog
指針是可修改的,進行自增或自減操做。而數組名是個常量,是不可修改的,也就是說,pointer++是合法的,可是a++是非法的。內存