delphi指標簡單入門:
看乙個指標用法的例子:
1 var
2 x, y: integer; // x and y 整數型別
3 p: ^integer; // p 指向整數型別的指標
4 begin
5 x :=17; // 給 x 賦值
6 p := @x; // 把 x的位址賦給p
7 y := p^; // 取出p所指向的數值賦給y
8 end;
第二行定義了兩個變數x,y. 第三行宣告了p是指向整數型別的指標;意味著p能夠指向x或者y的位址.第五行賦給x值,第六行把x的位址賦給p.最
後通過p指向的變數賦值給y.此時,x和y有相同的值.
操作符@用來取出變數的位址,也可以取出過程和函式的位址.
而符號^有兩個目標,
當它出現在型別定義的前面時如 ^typename 表示指向這種型別的指標;
當它出現在指標變數後邊時 如 point^ 返回指標指向的變數的值;
理解指標比較容易理解物件導向的pascal語言,因為指標經常在幕後操作.任何要求動態分配大的記憶體空間的型別可以用指標型別.例如
,long-string變數,實際在使用指標進行操作.另外一些高階的程式設計技術需要使用指標型別.
有時指標是適應object pascal嚴格的型別限制的唯一方法.同過乙個通用的指標型別,通過型別轉換成不同的指標型別,如下面的例子:
type
pinteger = ^integer;
var
r: single;
i: integer;
p: pointer; //通用的指標
pi: pinteger;
begin
p := @r; //取出r的記憶體位址
pi := pinteger(p); //把通用型別轉換成指向整數型別的指標
i := pi^;
end;
當然了,實數和整數的儲存格式不同.這種賦值是把原始的二進位制資料從r拷貝到i,而不進行轉換.
保留字nil是乙個特殊的常量可以賦給任何指標型別,當nil賦給乙個指標時,指標什麼也不指向,是乙個空指標.
@操作符返回變數的記憶體中的儲存位址,或者是過程/函式/方法;
1.如果變數,@x返回的是x的位址。如果編譯選項沒有開啟,著返回的事乙個通用的指標,如果編譯選項開啟了,著返回的是x的型別對應的指
針.
2.如果是例程(過程/函式),@f返回的是f的入口點,@f的型別是乙個指標。
3.當@用在類的方法中時,則方法的名稱必須有類名,例如@tmyclass.dosomething
指標指向tmyclass的dosomething方法。
當乙個過程變數在賦值語句的左邊時,編譯器期望乙個過程值在賦值語句的右邊。這種賦值使得左邊的變數可以指向右邊定義的過程或者函式
入口點。換句話說,可以通過該變數來引用宣告的過程或者函式,可以直接使用引數的引用。
var
f: function(x: integer): integer;
i: integer;
function somefunction(x: integer): integer;
...
f := somefunction; // 給f賦值
i := f(4); // 呼叫所指向的函式
在賦值語句中,左邊變數的型別決定了右邊的過程或者方法指標解釋。
var
f, g: function: integer;
i: integer;
function somefunction: integer;
...
f := somefunction; // 給f賦值
g := f; // 把f的值拷貝給g
i := g; // 呼叫函式
第一句獲得函式的入口,第二句將指標複製,第三句獲得函式的返回值。
有時候還可以這樣使用
if f = myfunction then ...;
在這裡,f的出現導致乙個函式呼叫;編譯器呼叫f指向的函式,然後呼叫myfunction,比較結果。這個規則是無論何時乙個過程變數(
procedural variable)出現在乙個表示式中,它表示呼叫所指向的函式或者過程。有時f指向乙個過程(沒有返回值),或者f指向乙個需要參
數的函式,則前面的語句會產生乙個編譯錯誤。要比較f和myfunction需要用
if @f = @myfunction then ...;
@f把f轉換成乙個包含位址的無型別的指標變數,@myfunction返回myfunction的位址。
獲得乙個過程變數的記憶體位址使用@@。例如,@@f返回f的位址。
@操作符通常把乙個無型別的指標值賦給乙個過程變數,例如:
var strcomp: function(str1, str2: pchar): integer;
...
@strcomp := getprocaddress(kernelhandle, 'lstrcmpi');
呼叫getprocaddres函式,用strcomp指向這個值
任何過程變數可以賦成nil,表示指證什麼也不指向。但是試圖呼叫乙個nil值的過程變數導致乙個錯誤,為了測試乙個過程變數是否可以賦值
,用標準的賦值函式assigned
if assigned(onclick) then onclick(x);
.呵呵
Delphi 指標 入門
指標,是乙個無符號整數 unsigned int 它是乙個以當前系統定址範圍為取值範圍的整數。指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。指標的指標就是用來存放指標所在的記憶體位址的。取址運算子 指標的引用解析操作符 1,型別指標的定義。對於指向特定型別的指標 varptr...
Delphi指標認識
大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。同時,這種說法也讓很多人 產生誤解,似乎只有c語言的指標才能算指標。basic不支援指標,在此不論。其實,pascal語言本身也是支援指標的。從最初的pascal發展至今的obje...
delphi 指標使用
指 針 指標的動態變數 1.定義指標型別 在turbo pascal中,指標變數中存放的某個儲存單元的位址,即指標變數指向某個儲存單元。乙個指標變數僅能指向某一種型別的儲存單元,這種資料型別是在指標型別的定義中確定的,稱為指標型別的基型別。指標型別定義如下 型別名 基型別名 例如 type q in...