程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 指針以及關於Delphi指針的自我理解(C++&Delphi)

指針以及關於Delphi指針的自我理解(C++&Delphi)

編輯:Delphi

以前學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;
      這些就是小弟作為一個菜鳥對指針的理解,當然這只是指針中的一小部分,要學的還很多,這個也只是寫出來和菜鳥同志們互相交流,供大牛指點的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved