全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1590
推到 Plurk!
推到 Facebook!

關於Pointer(指標/指針/指位器)的宣告/定義風格

 
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-26 20:01:26 IP:61.229.xxx.xxx 未訂閱
作者:蕭沖
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-26 20:34:50 IP:61.229.xxx.xxx 未訂閱

後記補充:

資料的變數是為了方便找資料(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
系統時間:2024-05-13 17:38:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!