delphi指针问题

标签 delphi pointers delphi-2006

我有以下代码,可以运行,但我不能 100% 理解它(请参阅代码中的注释):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TMyRec=record
    a:Integer;
    b:String;
  end;
  TRecArray=array of TMyRec;
  PRecArray = ^TRecArray;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
   v1:TRecArray;
   procedure Test(a:PRecArray);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 SetLength(v1,3);
 v1[0].b:='test1';//set the first value
 Test(PRecArray(v1));//call method to change the value assigned before
end;

procedure TForm1.Test(a: PRecArray);
begin
 ShowMessage(v1[0].b);//shows test1
 try
  a^[0].b:='test2' //this is raising an error...
 except

 end;
 PRecArray(@a)^[0].b:='test3';//this is working...
 ShowMessage(v1[0].b);//shows test3
end;

end.

我不明白为什么 'a^[0].b:='test2' 会引发错误。

谢谢!

最佳答案

您的“测试”过程需要一个“PRecArray”,但您正在向它传递一个“TRecArray”。尝试这样调用它

 Test(@v1);//call method to change the value assigned before

将“TRecArray”类型转换为“PRecArray”不会使其成为“PRecArray”。 (注意:你的“test3”当然会失败。)

关于delphi指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119659/

相关文章:

delphi - 在运行时更改 Intraweb IWFrame

delphi - 'initialization' 部分中匿名方法的奇怪错误

c++ - 如何将一个类中指向另一个类的指针复制到 C++ 中的另一个指针?

c - 在 C 中使用 calloc 时,指针地址中存储的是什么?

delphi - 检测Skype是否位于 "Compact View"或 "Default View"

delphi - 什么会导致 delete 循环 Sleep()ing 并且永远不会在 Borland/Embarcadero RTL 中返回?

c++ - 指针可以用来遍历字符数组吗?

delphi - 我无法在打开和保存对话框中获得 Delphi 上下文相关帮助

Delphi - TDataSet确定处于插入/编辑状态时是否被修改

delphi - ClientDataSet 上的 StatusFilter