DELPHI 指標使用

2021-07-15 18:33:15 字數 4664 閱讀 5598

delphi裡自己管理記憶體的兩對函式 new(),dispose()和getmem(),freemem()   

大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。同時,這種說法也讓很多人 產生誤解,似乎只有c語言的指標才能算指標。basic不支援指標,在此不論。其實,pascal語言本身也是支援指標的。從最初的pascal發展至今 的object     pascal,可以說在指標運用上,絲毫不會遜色於c語言的指標。   

以下內容分為八部分,分別是   

一、型別指標的定義   

二、無型別指標的定義   

三、指標的解除引用   

四、取位址(指標賦值)   

五、指標運算   

六、動態記憶體分配   

七、字元陣列的運算   

八、函式指標   

一、型別指標的定義。對於指向特定型別的指標,在c中是這樣定義的:   

int     *ptr;   

char     *ptr;   

與之等價的object     pascal是如何定義的呢?     

var   

ptr     :     ^integer;   

ptr     :     ^char;     

其實也就是符號的差別而已。   

二、無型別指標的定義。c中有void     *型別,也就是可以指向任何型別資料的指標。object     pascal為其定義了乙個專門的型別:pointer。於是,   

ptr     :     pointer;   

就與c中的   

void     *ptr;   

等價了。   

三、指標的解除引用。要解除指標引用(即取出指標所指區域的值),c     的語法是     (*ptr),object     pascal則是     ptr^。   

四、取位址(指標賦值)。取某物件的位址並將其賦值給指標變數,c     的語法是   

ptr     =     &object;   

object     pascal     則是   

ptr     :=     @object;   

也只是符號的差別而已。   

五、指標運算。在c中,可以對指標進行移動的運算,如:   

char     a[20];       

char     *ptr=a;       

ptr++;   

ptr+=2;   

當執行ptr++;時,編譯器會產生讓ptr前進sizeof(char)步長的**,之後,ptr將指向a[1]。ptr+=2;這句使得ptr前進兩 個sizeof(char)大小的步長。同樣,我們來看一下object     pascal中如何實現:   

var   

a     :     array     [1..20]     of     char;   

ptr     :     pchar;     //pchar     可以看作     ^char   

begin   

ptr     :=     @a;   

inc(ptr);     //     這句等價於     c     的     ptr++;   

inc(ptr,     2);     //這句等價於     c     的     ptr+=2;   

end;   

只是,pascal中,只允許對有型別的指標進行這樣的運算,對於無型別指標是不行的。   

六、動態記憶體分配。c中,使用malloc()庫函式分配記憶體,free()函式釋放記憶體。如這樣的**:   

int     *ptr,     *ptr2;   

int     i;   

ptr     =     (int*)     malloc(sizeof(int)     *     20);   

ptr2     =     ptr;   

for     (i=0;     i<20;     i++)   

free(ptr2);   

object     pascal中,動態分配記憶體的函式是getmem(),與之對應的釋放函式為freemem()(傳統pascal中獲取記憶體的函式是new() 和     dispose(),但new()只能獲得物件的單個實體的記憶體大小,無法取得連續的存放多個物件的記憶體塊)。因此,與上面那段c的**等價的 object     pascal的**為:   

var     ptr,     ptr2     :     ^integer;   

i     :     integer;   

begin   

getmem(ptr,     sizeof(integer)     *     20);     

//這句等價於c的     ptr     =     (int*)     malloc(sizeof(int)     *     20);   

ptr2     :=     ptr;     //保留原始指標位置   

for     i     :=     0     to     19     do   

begin   

ptr^     :=     i;   

inc(ptr);   

end;   

freemem(ptr2);   

end;   

對於以上這個例子(無論是c版本的,還是object     pascal版本的),都要注意乙個問題,就是分配記憶體的單位是位元組(byte),因此在使用getmem時,其第二個引數如果想當然的寫成     20,那麼就會出問題了(記憶體訪問越界)。因為getmem(ptr,     20);實際只分配了20個位元組的記憶體空間,而乙個整形的大小是四個位元組,那麼訪問第五個之後的所有元素都是非法的了(對於malloc()的引數同 樣)。   

七、字元陣列的運算。c語言中,是沒有字串型別的,因此,字串都是用字元陣列來實現,於是也有一套str打頭的庫函式以進行字元陣列的運算,如以下代 碼:   

char     str[15];   

char     *pstr;   

strcpy(str,     "teststr");   

strcat(str,     "_testok");   

pstr     =     (char*)     malloc(sizeof(char)     *     15);   

strcpy(pstr,     str);   

printf(pstr);   

free(pstr);   

而在object     pascal中,有了string型別,因此可以很方便的對字串進行各種運算。但是,有時我們的pascal**需要與c的**互動(比如:用 object     pascal的**呼叫c寫的dll或者用object     pascal寫的dll準備允許用c寫客戶端的**)的話,就不能使用string型別了,而必須使用兩種語言通用的字元陣列。其 實,object     pascal提供了完全相似c的一整套字元陣列的運算函式,以上那段**的object     pascal版本是這樣的:   

var     str     :     array     [1..15]     of     char;   

pstr     :     pchar;     //pchar     也就是     ^char   

begin   

strcopy(@str,     'teststr');     //在c中,陣列的名稱可以直接作為陣列首位址指標來用   

//但pascal不是這樣的,因此     str前要加上取位址的運算子   

strcat(@str,     '_testok');   

getmem(pstr,     sizeof(char)     *     15);   

strcopy(pstr,     @str);   

write(pstr);   

freemem(pstr);   

end;   

八、函式指標。在動態呼叫dll中的函式時,就會用到函式指標。假設用c寫的一段**如下:   

typedef     int     (*pvfn)(int);     //定義函式指標型別   

int     main()   

就我個人感覺來說,c語言中定義函式指標型別的typedef**的語法有些晦澀,而同樣的**在object     pascal中卻非常易懂:   

type     pvfn     =     function     (para     :     integer)     :     integer;   

var   

fn     :     pvfn;     

//也可以直接在此處定義,如:fn     :     function     (para:integer):integer;   

hm     :     hmodule;   

begin   

hm     :=     loadlibrary('test.dll');   

fn     :=     getprocaddress(hm,     'function1');   

fn(2);   

freelibrary(hm);   

end;   

delphi 指標使用

指 針 指標的動態變數 1.定義指標型別 在turbo pascal中,指標變數中存放的某個儲存單元的位址,即指標變數指向某個儲存單元。乙個指標變數僅能指向某一種型別的儲存單元,這種資料型別是在指標型別的定義中確定的,稱為指標型別的基型別。指標型別定義如下 型別名 基型別名 例如 type q in...

Delphi之指標使用

以下內容分為八部分,分別是 一 型別指標的定義 二 無型別指標的定義 三 指標的解除引用 四 取位址 指標賦值 五 指標運算 六 動態記憶體分配 七 字元陣列的運算 八 函式指標 一 型別指標的定義。對於指向特定型別的指標,在c中是這樣定義的 int ptr char ptr 與之等價的object...

DELPHI如何使用指標

大家都認為,c語言之所以強大,以及其自由性,很大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。同時,這種說法也讓很多人產生誤解,似乎只有c語言的指標才能算指標。basic不支援指標,在此不論。其實,pascal語言本身也是支援指標的。從最初的pascal發展至今的objec...