關於Pointer(指標/指針/指位器)的宣告/定義風格 |
|
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
作者:蕭沖
Email: qs.xiao@gmail.com 時間:20060826 許多人都在爭議c/c 的pointer的宣告/定義風格: type *var1; // code standard 1 type* var2; // code standard 2 似乎第二種方式比較容易讓人了解,但是事實上那樣的風格並不"正確"。 使用第二種風格有一種限制: 不能連續宣告 type* var3, var4 // 只有var3是pointer,var4是一般的變數 就compiler與從assembly的觀點來看,第二種方式才是對的。 每個變數名都代表著memory的位址,變數名只是方便讓我們不用去記憶每個放資料的位址。ASM裡有幾種定址方(addressing): 1/port addressing 2/register addressing //使用register來放資料 3/immediate addressing //直接給常數值 4/memory direct addressing //使用memory的位址放資料 5/memory indirect addressing //使用memory的位址的位址資料放資料 1-4 的方式就像我們宣告一般變數名處理資料一樣 5則像是pointer 或是 array 間接的取資料 在ASM裡,使用[ ]符號來把register或是memory address包起來,表示資料是放在這個register/mem內資料所記載的位址,而非register/mem 這個地。[mem]或[register]就像是把一般的變數加上一個[ ]的符號來表示它是用間接的方式來取值!就如同C/C 中用*來表達間接取值。 再用個現實例子來說明一下變數與指標: 比如說你有數個倉庫,它們的門牌號碼是100號,103號,108號。100號裡放的是褲子,103號放的是上衣,108號放的是帽子。當我要請工人去拿上衣的時候,我就會說:請去103號拿庫存。經過一陣子,我們的倉庫變更多了,有好多的門牌號,110,111,120,131…我們自己都快記不住哪個號碼是放什麼。於是我們就想了個方法,即在門前貼上貼紙: 把100號貼上一個褲子的圖,把103號貼衣服的圖,把108號貼帽子的圖…當我們想要拿褲子的時候,我們不再告訴工人去100號拿,而是告訴工人去「貼有褲子的倉庫」拿貨。 上面的例子裡,門牌就相當於memory的位址,而貼紙就像是變數名。 那什麼情形是pointer呢? 比如說我們有一批臨時的食品乾貨,當貨來到倉庫時必需因應當時的倉庫使用情形而暫放在某個門牌號,等工人把貨確定放好位子後再回報放在哪個門牌上。為了這種臨時性的需求,我們開了一個門牌號,比如說140號,並也貼了一張辨識用的「食品記錄本圖」,然而裡面不放一般的貨,只放一個記錄本,上面會有工人回報門牌的記錄。於是當我們要工人去拿這臨時貨時,我們會說:去140號查記錄本,然後再去所記錄的門號拿貨來! 這個記錄圖就是代表pointer變數。 一般的圖和「記錄本圖」有什麼不同? 就是拿貨的方式不同。看到一般圖就進倉庫直接拿貨,看到記錄本圖就只道要進去查記錄本,再到確定的地方取貨。從這裡可以了解,貨品本身是哪一類的並不重要,重要的是圖哪一種圖!不同的圖代表不同的取貨方式。因此,你可以想像為何要用 type *var 的宣告。因為var和*var是不同的,var是去var的地位直接拿,*var是到var的地方去查本取貨,僅管這二個的貨品都是同一類的。 這麼說來,你能了解為何我說 type* var是看似合理,但並非根子裡是那樣的。也因此了解為何c/c 中 type* var1, var2 只有var1被compile成pointer。 *號應該看做是變數名的Qualifier(修飾詞),而非type與type結合。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 ![]() ![]() ![]() ![]() ![]() 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
後記補充: 資料的變數是為了方便找資料(memory address 的alias)。 我們都知道在電腦世界裡,所有資料的最後結構都是010101…二進位。型別則讓我們可以分門別類的把010101的資料做不同的詮釋以呈現我們人類所可以理解的資訊。 Pointer是為了取資料的方式不同而生,它該是屬於定址問題,也就是說它和變數是該是「同一夥」的! 再者,若強硬說Pointer是一種型別,那這樣的型別提供了什麼有義意的演算與呈現? 所以該說 Pointer Variable,而非Pointer type ! 不是嗎?!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |