function FillBuffer(Buf:PChar;Count:Integer):Integer
begin
  . . .
end;
// assume MAX_SIZE is a predefined constant
var
  i: Integer;
  buf: array[0..MAX_SIZE] of char;
  S: string;
begin
  i := FillBuffer(0, buf, SizeOf(buf)); // treats buf as a PChar
  S := buf;
  //statements
end;
buf是一个char数组,而FillBuffer中对应的位置是pchar类型,
i := FillBuffer(0, buf, SizeOf(buf)); // treats buf as a PChar
  S := buf;我想知道这个buf是如何操作的,是怎么样放到fillbuffer中得到buf的值的。

解决方案 »

  1.   

    1)Delphi中有这样一条潜规则,如果一个非动态字符数组是可以当成一个PChar来用
    2)function FillBuffer(Buf:PChar;Count:Integer):Integer
    var
      szBuf: PChar;
      C: Char;
    begin
      szBuf := Buf;
      while Count > 0 do
      begin
        C := Buf^;
        ShowMessage(C);
        Inc(szBuf);//szBuf++
        Dec(Count);
      end;
    end;
      

  2.   

    FillBuffer在这个方法中
    我如何给buf赋值。
      

  3.   

    delphi 中关于静态数组和 PChar 的关系,与 c/c++ 是类似的,编译器提供类型的完全兼容和转换。
    因此 buff: array [0..10] of Char;与pbuff : PChar;
    pbuff := AllocMem(11);是一样的。至于拷贝操作,推荐 StrLCopy, 它可以指定拷贝到长度,避免了 StrCopy 拷贝时潜在的缓冲区溢出的问题。
    同样字符串合并之类的函数 StrCat 也有带长度参数的版本 StrLCat,推荐用这类函数。
      

  4.   

    哦,补充一下:buff: array [0..10] of Char;  // 是在栈上分配,优点是无需自己手动释放; delphi默认是1m,因此如果分配太多的静态数组,将导致栈溢出。pbuff : PChar;
    pbuff := AllocMem(11);  // 是在堆上,需要自己手动 FreeMem(pbuff),但是大小上不像 栈上那么严格。