Delphi之指针使用

Delphi之指针使用

string详解

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b: array[0..19] of char;
  i: Integer;
  s, str: string;
begin
  FillChar(a, SizeOf(a), 0);  
  FillChar(b, SizeOf(a), 0);

  for i:= 0 to 9 do
    a[i]:= chr($30+i);
  ShowMessage(a);          //'0123456789'

  StrCat(@a,'wertyui');
  s:= StrPas(@a[0]);
  ShowMessage(s);          //'0123456789wertyui'

  StrCopy(@b,@a);
  StrCopy(@a,'asdfghj');
  ShowMessage(a);          //'asdfghj'
  ShowMessage(b);          //'0123456789wertyui'

  SetLength(str,20);
  StrCopy(@str[1],@b);
  ShowMessage(str);        //'0123456789wertyui'
  SetLength(str,0);
//  StrMove()
end;
procedure TForm1.btn1Click(Sender: TObject);
var
  str: string;
begin
  str:= 'atrzxcZXcZXcZXcZXcZXcZXXCzXCZZXcxzvZXCZcZXCZX';
  ShowMessage( IntToStr(Integer(@str))+';'#$0D#$0A+          //1635712
              inttostr(Integer(@str[1]))+';'#$0D#$0A+        //2958704 字符串首地址
              inttostr(Integer(@str[2])));                   //2958705
  ShowMessage(IntToStr(SizeOf(str)));                        //4 str变量是个指针
end;

procedure TForm1.btn2Click(Sender: TObject);
const
  TempString: array[0..15] of Char = 'This is a test.'#0;
var
  Text: PChar;
begin
//  Text := @TempString[0];  //字符数组首地址
  Text := @TempString;       //字符数组首地址
  ShowMessage(IntToStr(Integer(@TempString[0]))+';'+IntToStr(Integer(@TempString)));
  {Text指向Null结尾的TempString字符数组的第0个元素的地址,
  也就是整个字符数组的首地址}
  MessageBox(0, Text, 'Test Message', 0);
end;

procedure TForm1.btn3Click(Sender: TObject);
var
  Text1: array[0..14] of Char;  { 大小为15个字符}
  Text2: array[0..20] of Char;  { 大小为21个字符}
  Text3: PChar;
begin
  Text1 := 'This is a test'#0;   {Text1和Text2的字符长度都为15个字符}
  Text2 := 'This is a test.';
  MessageBox(0, Text1, 'Test Message 1', 0);
  {因为Text1的字符长度超过了其声明的大小,因为会内存访问混乱,显示换乱}
 
  MessageBox(0, Text2, 'Test Message 2', 0);
  {Text2的字符长度比起声明的大小要小,因为正常访问,显示正确}

  Text3:= PChar('aabbcc'#100#100#0#101);
  ShowMessage(Text3+';'+IntToStr(Length(Text3)));
  //8 Pchar以#0结尾,但#0不计入Pchar长度
end;

 

 

 

 

 

Delphi 将string 转为 Array of AnsiChar

 

 


procedure TForm1.btn1Click(Sender: TObject);
var
  ms: TMemoryStream;
  str: string;
  arr, arr2: array of Char;
  p: PChar;
  iLen: Integer;
begin
  New(p);
  ms:= TMemoryStream.Create;
  ms.LoadFromFile('C:\Users\Administrator\Desktop\新建文本文档.txt');
  iLen:= ms.Size;
  SetLength(str,iLen);
  SetLength(arr,iLen);
  SetLength(arr2,iLen);
  ms.ReadBuffer(str[1],iLen);
  MoveMemory(@arr[0],@str[1],iLen);
  p:= @arr[0];
  StrCopy(@arr2[0],p);
  ShowMessage(str+ p);
end;

procedure TForm1.btn2Click(Sender: TObject);
var
  ms: TMemoryStream;
  arr, arr2: array of Char;
  iLen: Integer;
begin
  ms:= TMemoryStream.Create;
  ms.LoadFromFile('C:\Users\Administrator\Desktop\新建文本文档.txt');
  iLen:= ms.Size;
  SetLength(arr,iLen);
  ms.ReadBuffer(arr[0],iLen);
  SetLength(arr2,iLen);
  CopyMemory(@arr2[0],@arr[0],iLen);
  ShowMessage('a');
end;

procedure TForm1.btn3Click(Sender: TObject);
var
  ms: TMemoryStream;
  str: string;
  arr: array of Char;
  iLen: Integer;
begin
  ms:= TMemoryStream.Create;
  ms.LoadFromFile('C:\Users\Administrator\Desktop\新建文本文档.txt');
  iLen:= ms.Size;
  SetLength(str,iLen);
  SetLength(arr,iLen);
  ms.ReadBuffer(str[1],iLen);
  CopyMemory(@arr[0],@str[1],iLen);    //@arr[0]时,成功
  SetLength(arr,50);                   //@arr时,失败
  ShowMessage(str);
end;

procedure TForm1.btn4Click(Sender: TObject);  
var
  ms: TMemoryStream;
  str,str2: string;  
  iLen: Integer;
begin
  str:= '0123456789';
  ms:= TMemoryStream.Create;
  ms.WriteBuffer(str[1],length(str));
  iLen:= ms.Size;
  SetLength(str2,iLen);
  ms.Position:= 0;                        //注意,从0开始(前边用了WriteBuffer)
  ms.ReadBuffer(str2[1],iLen);
  showmessage(str2);
end;

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值