在C/C++里面,  int i =5;
  const int * p = &i;
  *p = 6;    //Error来防止p指向的内容被改动。
但是在Delphi里,好像找不到同样功能的语法。const
  ci:Integer=8;  
var
  PC:PInt;  ShowMessage(Inttostr(ci));   // 8
  PC:=@Ci;
  PC^:=9;
  ShowMessage(Inttostr(ci));   // 9
连常量的内容都会被改了。如果用const声明指针,只能限制指针不能指向别的地方,但也无法保护指向的内容。请教各位,要实现类似C/C++里的指针常量应该怎么做?

解决方案 »

  1.   

    这个还真是不知道呀
    不过就算有也不会安全到哪里去的,C++里面不是还有个const_cast吗?
      

  2.   

    你用var声明的指针怎么会是常量呢?
    const
      i: integer = 25;
      p : ^integer = @i;
    这样就好了。
      

  3.   

    to DelphiGuy() :    可能我没有把意思讲清楚。你说的这个我知道。但我要实现的是指针指向的“内容”不能改变,具体到你的代码里,就是25的值不能改变。不是要限制指针本身指向的地址。
      

  4.   

    是这样的。
    打个比方,有一个类A,正在维护一个链表。与用户交互的是类B。
    类B要取数据时就从类A得到一个指向链表上某个节点的指针。当用户要删除该节点时,类B就把该指针返回给类A,类A就执行方法把它从链表上删除。
    由于类A传给类B的是链表上的一个节点,如果类B可以更改这个指针的内容(比如更改了该节点的前后指针),就有可能造成链表的崩溃。这样的话,类的“黑匣”就会被破坏了。因此我就想Delphi有没有这样的语法,可以实现类似C中的指针常量一样的功能,保护链表不被破坏。如果不用指针的话,要在链表上定位B返回的要删除的节点就比较麻烦了,节点(是一个记录)中的各个域都要进行比较。
      

  5.   

    你这样做本身就违反了面向对象的设计原则嘛。
    既然链表的维护是由A来完成的,那么A就不应该暴露链表给外部类/函数直接访问,所有的操作应该由A来完成,A只能提供若干方法让外部类/函数来请求执行某些操作。
    不用指针,你可以返回一个结点的Index呀。
    VCL的很多类似类,比如TStringList,都使用这种技术的。
      

  6.   

    我也觉得这与面向对象的设计原则不符,当时匆匆忙忙,根本没时间细想,现在改起来才头痛。也只有加个index,传递结点的index算了。但我的链表经常要在中间进行插入和删除操作的,加个index也有问题,因为定位结点时又要历遍链表了。
      

  7.   

    自己顶一下.到底Delphi有没有这样的功能?