指標,是乙個無符號整數(unsigned int),它是乙個以當前系統定址範圍為取值範圍的整數。指標對應著乙個資料在記憶體中的位址,得到了指標就可以自由地修改該資料。指標的指標就是用來存放指標所在的記憶體位址的。
@:取址運算子;
^:指標的引用解析操作符;
1,型別指標的定義。對於指向特定型別的指標
varptr : ^integer;
ptr : ^char;
2,無型別指標的定義。也就是可以指向任何型別資料的指標。object pascal為其定義了乙個專門的型別:pointer。
ptr : pointer;
3,指標的解除引用。要解除指標引用(即取出指標所指區域的值), ptr^。
4,取位址(指標賦值)。取某物件的位址並將其賦值給指標變數,ptr := @object;
看乙個指標用法的例子:
var
x, y: integer; // x and y 整數型別
p: ^integer; // p 指向整數型別的指標
begin
x := 17; //給 x 賦值
p := @x; //把 x 的位址賦給 p
y := p^; //取出p所指向的數值賦給 y
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,表示指證什麼也不指向。
Delphi指標簡單入門
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 第二行定義了...
Delphi指標認識
大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。同時,這種說法也讓很多人 產生誤解,似乎只有c語言的指標才能算指標。basic不支援指標,在此不論。其實,pascal語言本身也是支援指標的。從最初的pascal發展至今的obje...
delphi 指標使用
指 針 指標的動態變數 1.定義指標型別 在turbo pascal中,指標變數中存放的某個儲存單元的位址,即指標變數指向某個儲存單元。乙個指標變數僅能指向某一種型別的儲存單元,這種資料型別是在指標型別的定義中確定的,稱為指標型別的基型別。指標型別定義如下 型別名 基型別名 例如 type q in...