以前學C++,發現C++最強大的地方就是指針了(這個不是我發現的。。。大牛都這麼說,我只是小菜一個),寫東西的時候總是用指針,而且C++的很多函數參數都是用的指針,特別是需要輸出的參數,幾乎都是用的指針傳址,從而得到返回值,我發現很多API函數的指針類型參數都是[out]的說明。
用了那麼就的指針,自己也算是小小的弄明白了,指針就是用來尋址的(大牛別扔西瓜啊。。。),編程裡面難免會遇到類型強制轉換,而指針用的強制轉換特別多,而我個人認為指針類型的強制轉換很大一個原因是需要對地址進行尋址,不同的指針類型只是說尋址的時候的步長不同而已,別的沒什麼區別。舉個例子來說:
一個short的指針*ps和char的指針*pc,假設都指向地址1000,假設地址單位為字節,對於加一來說,ps+1就是說地址向後移動了一個字,也就是說加完之後指向1002,而對於pc+1來說,後移一個字節,結果便是1001了。而對於強制轉換來說,只是改變尋址步長。
short *ps;
char *pc;
pc+1;//1001
ps+1;//1002
同樣,上面的(char*)ps+1,得到的結果便是1001,而(short*)pc+1結果是1002。這個便是指針強制轉換所帶來的好處了。
short *ps;
char *pc;
(short*)pc+1;//1002
(char*)ps+1;//1001
最近在學Delphi,剛開始學那些組件,然後在delphi中用API函數,用到API函數的時候,通過函數聲明,發現了不同點,C++的API說明中的指針參數很大一部分在Delphi中被換成了var的引用(萬一大師說的這其實也是傳址),然後就看了點Delphi指針的說明,說Delphi也有指針,自己也學習了下Delphi的指針,總結一下:
Delphi的指針本質上和C++沒什麼區別,都是地址,但是Delphi的指針的算數運算就沒C++那麼的靈活了(Delphi的指針更加嚴格),對於“+”加來說,只支持PChar和整數相加(這個是在Object Pascal裡面看到的),也就是說對於“+”和“-”操作來說,步長是一個字節,同樣加1的話例:
var
pshort:ShortInt;
psmall:SmallInt;
//同樣假設初始指向1000,單位字節
begin
PChar(pshort)+1;//結果為1001
PChar(psmall)+1;//結果也1001
end;
要想實現C++一樣的功能的話:
var
pshort:ShortInt;
psmall:SmallInt;
//同樣假設初始指向1000,單位字節
begin
PChar(pshort)+1;//結果為1001
PChar(psmall)+sizeof(SmallInt)*1;//結果為1002,我這樣寫只是為了形象,PChar(psmall)+2;就OK了
end;
若想實現和C++一樣的強制轉換來改變指針步長的話,便得這麼寫:
var
pshort:ShortInt;
psmall:SmallInt;
//同樣假設初始指向1000,單位字節
begin
PChar(pshort)+sizeof(SmallInt)*1;//結果為1002
PChar(psmall)+1;//結果也1001
end;
這個好像沒什麼特別,反正Delphi都是將步長轉為字節來算數加減的,所以這種強制轉換沒意義。
不過Delphi提供的一個函數Inc能實現除了PChar類型指針的自加尋址,這個就是你的指針類型是什麼類型,步長便是此指針類型的大小,例:
var
pi:Pinteger;
psmall:PSmallInt;
//同樣假設初始地址1000,單位字節
begin
inc(pi);//1004
inc(psmall);//1002
inc(psmall, 2);//1006
end;
這些就是小弟作為一個菜鳥對指針的理解,當然這只是指針中的一小部分,要學的還很多,這個也只是寫出來和菜鳥同志們互相交流,供大牛指點的。