谁能帮我看看,关于指针的问题。(50分)

  • 主题发起人 主题发起人 javesun
  • 开始时间 开始时间
J

javesun

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

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

type
PTxPacketHead=^TxPacketHead;
TxPacketHead = packed record
dwSignature: longword
//
iLength: integer
//
dwOrdinal: longword
//
dwChecksum: longword
//
END;

PTest = ^TTest;
TTest = Record
test1: SmallInt;
test2: SmallInt;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
PTxPacketHead1: PTxPacketHead;
PTest1: PTest;
sStr: String;
begin
sStr:= 'abcdefghaaadfdfa';
PTest1:= PTest(Copy(sStr, 1, 4))
// .....???
PTxPacketHead1:= PTxPacketHead(Copy(sStr, 1, 16))
//......???
ShowMessage(inttostr(PTest1.test1)+' : '+inttostr(PTxPacketHead1.dwSignature));
end;

end.

哪位大虾来告诉俺一声,这个转换是怎么转换的?
另外,ShowMessage显示的是些什么东东?
 
who can help me ?
 
1、这是那个小白写的?
2、PTest1 := PTest(Copy(sStr, 1, 4))
Copy(sStr, 1, 4) 显然是个字符串,当然也是个临时变量,我用 s 代替;PTest(s) 实际上跟 Pointer(s) 的效果一样,就是取这个临时变量的首地址;这句连起来就是让 PTest1 这个指针变量指向 s 这个临时变量;由于 PTest1.test1 是 SmallInt(短整数,2 字节),因此会将 s 的前两个字符连起来看做一个 SmallInt,在内存中就是 $62 61(地址大的位数高),ShowMessage 出来就是 '25185';
3、PTxPacketHead1.dwSignature 这个就不用多说了吧,取 sStr 的前 4 个字符(LongWord 为 4 字节),在内存中就是 $64 63 62 61,ShowMessage 出来就是 '1684234849'。
 
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
PTxPacketHead1: PTxPacketHead;
PTest1: PTest;
sStr: String;
begin
sStr:= 'abcdefghaaadfdfa';
PTest1:= PTest(Copy(sStr, 1, 4))
// .....???
{ SmallInt 占2字节 }
{ PTest1^.test1 := 25185, PTest1^.test2 := 25699}
{ Copy(sStr, 1, 4) := 'abcd'
'ab' 被赋值到 PTest1^.test1 (取2字节)
'cd' 被赋值到 PTest1^.test2
a 的ASCII码为 $61
b 的ASCII码为 $62
'ab' 在内存中的值为 $6261 = 25185(十进制)
}

PTxPacketHead1:= PTxPacketHead(Copy(sStr, 1, 16))
//......???
{ longword 占4字节 }
{ 1684234849, 1751606885, 1684103521, 1634100326}
{ 'abcd' 被赋值到 PTxPacketHead1.dwSignature (取4字节)
a 的ASCII码为 $61
b 的ASCII码为 $62
c 的ASCII码为 $63
d 的ASCII码为 $64
'abcd' 在内存中的值为 $64636261 = 1684234849(十进制)
}
ShowMessage(inttostr(PTest1.test1)+' : '+inttostr(PTxPacketHead1.dwSignature));
{显示 25185 : 1684234849}
end;
 
PTxPacketHead=^TxPacketHead;
TxPacketHead = packed record
dwSignature: longword
//
iLength: integer
//
dwOrdinal: longword
//
dwChecksum: longword
//
END;

PTest = ^TTest;
TTest = Record
test1: SmallInt;
test2: SmallInt;
end;
这些是指针。指针在使用前要申请内存new(PTest1 )
 
To 楼上:
指针使用前并不需要 New,你想让它指哪都可以。
New 只是申请一块内存,并让指针指向它,在链表中用的较多。
 
后退
顶部