關於PChar和指標

2021-04-16 04:59:59 字數 1969 閱讀 5867

對於剛開始學程式設計的人來說,指標無疑是最大的恐懼和進步障礙了. 我本人也是如此,居然畢業1年後還是見到^就怕的要命.其實現在想來,其實指標變不是什麼難的東西,而且靈活運用它能有帶來許多便利,很多人把指標比喻成門牌號碼,這個比喻是再恰當不過了,乙個門牌號碼你當然看不到,這個門牌所對應的具體的是哪個房子哪棟樓是什麼樣的吧,指標也一樣,在win32裡它也只是乙個佔4個位元組(32位)的數字,而這個數字對應的記憶體具體所儲存的是什麼東西,你不去訪問它是不知道的.

很多人在寫要提供其他語言呼叫的dll的時候,知道要用pchar來做為字串,我就以pchar來做一些簡單的介紹吧.

首先我們來看一下pchar的定義:在隨便哪個事件裡定義乙個p:pchar將滑鼠放到pchar上,可以看到type system.pchar=^char可以看到pchar就是乙個指向char型別的指標,另外pansichar型別的也可以看到type system.pansichar:pchar 所以你應該以後不會問pansichar和pchar有什麼不同了吧.

既然是指標,如果要使用就要給它分配記憶體,或者將它指向乙個已經分配了的記憶體.我們先來看給pchar分配記憶體的函式,delphi提供了乙個叫stralloc的函式來給null-terminated string型別的字串分配記憶體,該函式可以用來給pchar分配size(引數)位元組的記憶體,並將pchar指向第乙個字元.知道它的作用,我們再來看下它的源**(按住ctrl點函式):

function stralloc(size: cardinal): pchar;

begin

inc(size, sizeof(cardinal));

getmem(result, size);

cardinal(pointer(result)^) := size;

inc(result, sizeof(cardinal));

end;

一句來解釋下,inc(size, sizeof(cardinal));將要分配的記憶體加上乙個cardinal的長度,為什麼後面再說

getmem(result, size);分配size長度的記憶體,並將result指向這塊記憶體開頭,注意getmem分配的都是堆記憶體.

cardinal(pointer(result)^) := size;將result指向的記憶體的前4個位元組填上size的大小.

inc(result, sizeof(cardinal));將result的指加4,也就是將result往後指了4個位元組

現在可以看出來了吧,stralloc分配記憶體時會用4個位元組來儲存函式申請的記憶體的大小.對應的釋放的函式strdispose函式這裡就不說了.所以如果要得到乙個pchar的申請的快取的大小只要看這4個位元組就知道了.其實只要取到這4個位元組儲存的資料-去4就是了,但其實delphi裡提供了strbufsize函式可以獲取,方法就是這樣的,大家可以注意到它另外申請了個pchar變數,大家可以自己想想如果不用這個變數的話程式該怎麼改,還有函式的定義該怎麼改.

來看這樣一段程式:

varp:pchar;

s:string;

begin

s:='aaaa';

tryp:=stralloc(1024);

//p:=strpcopy(p,s);

p:=pchar(s);

showmessage(p);

showmessage(inttostr(length(p)));

finally

strdispose(p);

end;

end;

以上**執行會發現strdispose(p);這句會報invalid pointer operation,非法的指標操作,為什麼呢?

因為p:=pchar(s);這句已經將p指向乙個區域性變數的記憶體,而它的分配和釋放是由delphi編譯器來管理的,你無法操作的,而你原來申請的1024個位元組的記憶體已經洩露了.所以指標操作裡千萬不要再建立記憶體後又重新指向另外乙個地方.前2天有個人問我,2個pchar的字元能不能連線直接用+來,也許你該想想,2個門牌號碼的數字加起來是不是就是代表這2個房間呢? 

關於Pchar 摘錄

乙個label的caption當作string直接加上下標去相應位置的字元,但是卻報錯,說不相容,請問delphi中的字串型別有什麼不同啊。謝謝各位大俠!建議先搜尋一下離線論壇 先解釋你的疑惑 乙個字串 string型別的 變數是可以通過腳標的方式訪問指定位置的字元的,但是 label 的 capt...

關於指標傳遞和指標的指標

一開始沒有理解,導致對這個概念非常的模糊和不解。最近看完 徹底搞定c語言指標詳解 裡面關於指標的指標的解釋有了頓悟感。其實,很好理解,是我把它想複雜了。我們都知道,實參和形參的區別。形參並無法改變實參,這就是值傳遞。還有一種叫指標傳遞,實質就是去操作指標的指向物件。例子如下 exchg2 int p...

關於指標和指向指標的指標

如果在乙個函式內部你需要修改指標所指向的資料內容,那就使用指標,如果你要修改指標的指向,那就使用指向指標的指標。如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。test函式的語句getmemory str,200 並沒有使str獲得期望的記憶體,str依舊是null。void getme...