c/c++中數組退化爲指針

  「數組名至關於指針,指向數組的首個成員的地址」這種表述見過不少,但實際上,這種說法很不全面,甚至在某些狀況下是錯誤的。下面舉例來講明一下。數組

  首先來看他們類似的特色:數據結構

  例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++是非法的。內存

相關文章
相關標籤/搜索