※ 引述《lalaboom (lalaboom)》之銘言:
: 標題: [問題] 對陣列名稱取址
: 時間: Tue May 12 19:54:31 2015
:
: 之前我的認知陣列名稱是一個常數指標,非指標常數喔,
:
: 1. 請問這個敘述對嗎?
:
: 現在有陣列 int b[2]; int a[2][3];
:
: 2. 請問為什麼 b 跟 &b 兩個address會一樣呢?
: 我可以理解 a, a[0], &a[0][0] 這3個一樣,
: 但是type不同,還是說這個認知也是錯的XD
:
: 3. 陣列在記憶體裏面除了宣告出來的連續空間,
: 陣列名稱是否會有另外像宣告指標一樣有一個變數空間嗎?
:
: 關於2之前好像有看到說&b = b 是定義好的 (compiler ? )
這些問題好像有許多的初學者都很困惑,
雖然明天我要考可怕的偏微分段考已經自顧不暇了,不過還是想回答一下。(笑
站在C語言本身的角度,陣列本身不是一個指標,它就是一個單單純純的陣列。
站在機器的角度,陣列佔據了記憶體一段連續的空閒,並且有個變數記錄了它的位置。
但是這個變數不是程式設計師可以直接獲得的,它需要進行轉換才能獲得。
先說說第二個好了:
b 跟 &b 的地址不一樣,簡單地說, &b 的地址並不存在,而且對編譯器來說是非法的。
因為當你在寫單獨一個 b 的時候, b 已經被隱式轉換成指標型態,而且這是被強制的。
在且 b 是一個右值(r-value),意思是你不能對此作取址的動作。
根據 ISO 文件 §4.2.1 Standard Conversions: Array-to-pointer conversion
An lvalue or rvalue of type "array of N T" or "array of unknown bound of T"
can be converted to an rvalue of type "pointer to T." The result is a pointer
to the first element of the array.
接下來的第三個也是一樣,
陣列名稱有佔空間嗎?結果呼之欲出,當然不佔。因為陣列名稱(b)是右值,並不佔空間。
可是你一定會很好奇不佔空間的話你的程式要如何知道陣列在哪?
這件事很妙,站在C語言的角度並不佔空間,但是實作上辦不到,所以當然要佔空間。
只是這個變數不是你的程式可以 access 的,它被編譯器巧妙地包裝了。
這樣很矛盾嗎?
其實,不。
因為程式語言本身定義的是語法結構,並不是實作的內容。
因此一個程式語言可以有很多種編譯器,像是 GCC C Compiler, MSVC etc.
如有錯誤歡迎指正。
( ̄▽ ̄#)=﹏﹏ 飄走=