Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 更改变量的指针_Pointers_Delphi - Fatal编程技术网

Pointers 更改变量的指针

Pointers 更改变量的指针,pointers,delphi,Pointers,Delphi,给定两个变量(布尔、整数、int64、TDateTime或字符串),如何将A设置为始终指向B 假设A和B是整数,我把B设为10 从这里开始,我希望A始终指向B,因此如果我这样做A:=5,它将修改B 我希望能够在运行时做到这一点。有几种方法,如果理解变量是什么,所有这些方法都是显而易见的:指向内存的指针 使用指针 使用对象 使用声明 使用最常用的指针,但也有最大的缺点(特别是如果你不是一个训练有素的程序员)。由于您使用的是Delphi,因此我建议您使用自己的类来操作它们的对象。也许您应该指定您使用

给定两个变量(布尔、整数、int64、TDateTime或字符串),如何将A设置为始终指向B

假设A和B是整数,我把B设为10

从这里开始,我希望A始终指向B,因此如果我这样做
A:=5
,它将修改B


我希望能够在运行时做到这一点。

有几种方法,如果理解变量是什么,所有这些方法都是显而易见的:指向内存的指针

使用指针 使用对象 使用声明
使用最常用的指针,但也有最大的缺点(特别是如果你不是一个训练有素的程序员)。由于您使用的是Delphi,因此我建议您使用自己的类来操作它们的对象。

也许您应该指定您使用的是pascal。我没有进行向下投票,但向下投票可能是因为格式不正确的问题。
var A:Integer;B:绝对整数A也许你应该解释一下你到底想解决什么问题。虽然我同意@Olivier的观点,但要实现你的Q真正想要的东西,一个显而易见的方法就是使用指针<代码>变量a:整数;b、 c:平特格;开始a:=5;b:=@a;c:=@a;ShowMessage(b^.ToString);ShowMessage(c^.ToString);b^:=10;ShowMessage(b^.ToString);ShowMessage(c^.ToString)如果不使用指针引用,是否不可能将“正常”变量改为指向另一个变量?a、 b:Integer而不是b:Pinteger提示:我不喜欢匈牙利符号,这使得您的代码(从pascal的角度来看,这很好)更难理解。使用
number
flag
更有意义,而且更干净。特别是对于类属性,这对我来说太可怕了。@hikari不,指针在pascal语言中是一种显式类型<代码>a,b:整数
是两个变量。只有
a:integer;b:绝对整数b技巧可以避免使用指针,但如果两种类型不匹配,则可能会很棘手-例如,如果您编写
b:string绝对值a@hikari如果可能的话,我的答案中会有。无论你问得多频繁,有多渴望,都没有作弊的可能——你还没有完全理解变量到底是什么。
var
  iNumber: Integer;   // Our commonly used variables 
  sText: String;
  bFlag: Boolean;

  pNumber: PInteger;  // Only pointers
  pText: PString;
  pFlag: PBoolean;
begin
  pNumber:= @iNumber;  // Set pointers to the same address of the variables
  pText:= @sText;
  pFlag:= @bFlag;

  // Change the memory that both variable and pointer link to. No matter if
  // you access it thru the variable or the pointer it will give you the
  // same content when accessing it thru the opposite way.
  pNumber^:= 1138;     // Same as   iNumber:= 1138;
  sText:= 'Content';   // Same as   pText^:= 'Content';
  pFlag^:= TRUE;       // Same as   bFlag:= TRUE;
type
  TMyVars= class( TObject )
    iNumber: Integer;
    sText: String;
    bFlag: Boolean;
  end;

var
  oFirst, oSecond: TMyVars;

begin
  oFirst:= TMyVars.Create();   // Instanciate object of class
  oSecond:= oFirst;            // Links to same object

  // An object is already "only" a pointer, hence it doesn't matter through
  // which variable you access a property, as it will give you always the
  // same content/memory.
  oFirst.iNumber:= 1138;       // Same as   oSecond.iNumber:= 1138;
  oSecond.sText:= 'Content';   // Same as   oFirst.sText:= 'Content';
  oFirst.bFlag:= TRUE;         // Same as   oSecond.bFlag:= TRUE;
var
  iNumber: Integer;
  sText: String;
  bFlag: Boolean;

  iSameNumber: Integer absolute iNumber;
  iOtherText: String absolute sText;
  bSwitch: Boolean absolute bFlag;
begin
  // Pascal's keyword "absolute" makes the variable merely an alias of
  // another variable, so anything you do with one of both also happens
  // with the other side.
  iNumber:= 1138;            // Same as   iSameNumber:= 1138;
  sOtherText:= 'Content';    // Same as   sText:= 'Content';
  bFlag:= TRUE;              // Same as   bSwitch:= TRUE;