procedure gettDictonry();
var dir:array[0..255] of char;
var sdir:string;
begin
    GetWindowsDirectory(dir,255);
    sdir:=strpas(dir);
    showMessage(sdir);
end;看到上面的代码的问题没有,至少我认为和正规的写法有出入在GetWindowsDirectory这个函数的第一个参数要求是PCAHR类型,为何用dir数组也可以使用呢?
大家知道的请指教下,

解决方案 »

  1.   

    可以这样理解:PChar是一种特殊的 array[0..n] of charvar
      P : PChar;
      A : array[0..255] of char;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      P := A;
      {看一下,是同一个地址}
      Showmessage(Format('@A=%p,  @A[0]=%p,  P=A=%p',[@A, @A[0], Pointer(P)]));
    end;但是,如果:var
      A: array[5..255] of char;//或array of char
    begin
      P:= A;//这样就不行了
      

  2.   

    {3楼代码在回贴时被CSDN搞坏,正确如下,注意是最小下标为0的定长Char型array}var
      P : PChar;
      A : array[0..255] of char;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      P := A;
      Showmessage(Format('@A=%p,  @A[0]=%p,  P=A=%p',[@A, @A[0], Pointer(P)]));
    end;
      

  3.   

    我以前在跟踪调试的时候也发现两者相等,但是DELPHI为什么要把PCHAR和array[0..n] of char (N为小于等于255的自然数)等同,为什么这么做呢,
    不追根就底我心理不爽啊
      

  4.   

    我以前在跟踪调试的时候也发现两者相等,但是DELPHI为什么要把PCHAR和array[0..n] of char (N为小于等于255的自然数)等同,为什么这么做呢,
    不追根就底我心理不爽啊
      

  5.   


    你这样理解吧:拿GetWindowsDirectory()来说,这是一个Win32API函数---->它是用C语言写的---->在C里没有字符串的概念---->一般是这样声明:char*一个指针---->其实就是一个字符数组,或者说一个PChar指针。GetWindowsDirectory()的第一个参数是要求是一个指针,而前面说的P、@A、@A[0]、以及A都是指针。至于为什么array[5..255]不行,那是出于安全的考虑,因为只有在Delphi里才可以这样声明数组至于为什么array of char不行,那是因为array of char使用了Write on Copy技术,类似于长字符串string类型,在第一个元素之前有引用计数、长度等信息存储,@A<>@A[0]
      

  6.   

    一切变量名字、对象名字都是指针不应该问为什么可以这样,而是要考虑为什么有的就不允许这样另外,上面说的Write on Copy说错了,是我记错了,应该是Copy On Write
      

  7.   

    PCAHR是一个指针,而在DELPHI中数组也看做作成指向第一个数组元素的指针