在C語言中,我們將第 0 個元素的地址稱為數組的首地址,數組名可以是一個指針,指向數組的第 0 個元素,那麼數組和指針是等價的嗎?


不等價,數組能隱式轉換成指針罷了。看到有書這麼寫的話應該考慮直接扔掉。數組和指針的區別應該是十分基礎而顯然的。

定義一個指針對象 T *ptr; 後 ptr 這個對象裡面沒有 T 類型對象,不過可能可以通過 ptr 訪問存在於別處的 T 類型對象。

定義一個數組對象 T arr[N]; 後 arr 這個對象裡面有 N 個 T 類型對象。將 arr 隱式轉換成指針後,能訪問的 T 類型對象是 arr 裡面的對象。


按照Dennis M. Ritchie的說法,在C語言還叫NB語言(new B)的時候,數組和指針是等價的。後來dmr需要允許在結構體(struct)裡面用數組成員,就沒辦法保持等價了。

來源:The Development of the C Language,Embryonic C一節。URL: www.bell-labs.com/usr/dmr/www/chist.html


除了數組能decay成指針,這倆還有啥關係嗎。。。


數組和指針不管是語義上還是實現上都不等價。

  • 數組是用來就地聲明一段連續的存儲。它就在你寫它的地方,比如全局區或者棧上。
  • 指針是一種裸奔的引用語義。

這種疑惑體現了C的一個設計問題:數組類型是二等公民,你不得不在很多地方使用指針(及其增減運算)去訪問數組。


數組不是指針。指針是指針,數組是數組。

數組不表示地址,數組名也不表示地址。


推薦閱讀:
相關文章