陣列中&a與&a[0]的區別

無鞋童鞋發表於2017-07-09

  在探討這個問題之前,我們首先來看一道筆試題,如下:
  【摘自牛客網】下列程式碼的結果是:(正確答案是 C)

main() 
{ 
    int a[5]={1,2,3,4,5}; 
    int *ptr=(int *)(&a+1); 
    printf("%d,%d",*(a+1),*(ptr-1)); 
}

  A、3,5   B、2,4   C、2,5   D、3,4
  下面我們來分析一下選擇C的原因,解釋清楚這個題的正確答案,你就能清楚陣列中&a與&a[0]存在什麼區別了。
  題目中首先定義了存放5個int型別空間大小的記憶體,然後初始化5個數。我們知道直接使用陣列的名字a表示的是一個指向陣列首地址的指標,所以直接a與&a[0]是相同的意思,都表示陣列的首地址。所以*(a+1)很好理解,假設a地址是0x1000,就是取(0x1000+sizeof(int))地址的數,由於陣列的實體地址是連續的,當然就是取2。
  那&a表示什麼意思呢,相當於取存放指向陣列首地址的指標的儲存地址,話有些繞,但是細細品味你就會發現,它就相當於二維指標,假設每個一維指標指向一排陣列(當然除了第一個一維陣列的指標之外實際都沒有申請,但是在訪問野指標之前計算機也不知道那塊地址是否存在,但的確可以由實體地址連續性來獲取這塊地址的表示),所以簡言之&a表示第一排陣列,&a+1就是表示第二排陣列(就是5*sizeof(int)=5*4=20空間大小後一段空間的首地址)。
  有了上面的介紹就好理解了,*(ptr-1)是表示取(0x1000+5*sizeof(int)-sizeof(int))地址中的數,算得為5。
  總結:
  &a[0]表示陣列的首地址,與直接a相同意義。而&a表示儲存指向陣列首地址的指標的地址,可以用二維指標來理解。

  其他二維指標和陣列更詳細說明請閱讀博文:http://blog.csdn.net/fx677588/article/details/69592329


  個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
  轉載請註明出處:http://blog.csdn.net/FX677588/article/details/74857473

相關文章