1. 程式人生 > >控制代碼與指標的區別

控制代碼與指標的區別

控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著一個數據在記憶體中的地址,得到了指標就可以自由地修改該資料。Windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以Windows給每個使用GlobalAlloc等函式宣告的記憶體區域指定一個控制代碼(本質上仍是一個指標,但不要直接操作它),平時你只是在呼叫API函式時利用這個控制代碼來說明要操作哪段記憶體。當你需要對某個記憶體進行直接操作時,可以使用GlobalLock鎖住這段記憶體並獲得指標來直接進行操作。 
 
“控制代碼”(handle),handle的本意是把柄,把手的意思。是你與作業系統打交道的東西。舉個例子:比如你做了虧心事(我說的是比如,呵呵),不幸讓我抓住了把柄,那麼我讓你做什麼你就得做什麼,因為你的把柄在我這。我們程式設計的時候也是這樣,比如我們要想操縱一個視窗,那我們就必須“抓住它的把柄”,只有這樣,我們才能改變它的屬性,改變它的式樣,甚至銷燬它(狠了點兒)。我們再引用一個通俗一點的例子,比如你考上了大學,入學後,學校(作業系統)會給你一個學生證號。注意,這個號碼是學校指定的,你無法自選。有了這個號碼(學生證,假設一證多用)就可以享受學校提供的服務:如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂裡買啤酒,因為學校不允許這種服務。而在計算機中系統提供的服務就是API呼叫,你有了HANDLE,就可以理直氣壯地向系統提出呼叫API的服務。而指標的權力就大多了,有了指標你可以到處去喝酒,打架,學校(作業系統)管不著,所以控制代碼和指標的區別在於控制代碼只能呼叫系統提供的服務。而控制代碼雖然是一個能相互區別的號碼,但與我們普通的ID號又有區別,普通的ID號是可以由程式設計師自己定義的,而控制代碼不行,它是物件生成時系統指定的,是為了區別系統中存在的各個物件,這個控制代碼不是由程式設計師賦給的。實際應用中,最常用的就是檔案控制代碼和視窗控制代碼。例如,視窗控制代碼的值是一個長整數,每個窗體都用一個控制代碼來表示。所以控制代碼是不會重複的,很多的函式都會用到窗體的控制代碼。