灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3182回复:0

指针以及关于Delphi指针的自我理解(C++;Delphi)

楼主#
更多 发布于:2012-09-08 13:05

以前学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;
      这些就是小弟作为一个菜鸟对指针的理解,当然这只是指针中的一小部分,要学的还很多,这个也只是写出来和菜鸟同志们互相交流,供大牛指点的。

喜欢0 评分0
游客

返回顶部