请问
var hh : String;
  hh := 'efwefwefw';pointer(hh)^,@(hh[1])分别表示的什么意思?
我认为pointer(hh)^表示的就是第一个字符的物理地址,但是它又和
@(hh[1])不相等。晕了。。

解决方案 »

  1.   

    是pointer(hh) 不是pointer(hh)^
      

  2.   

    Delphi的string是优化过的,在字符串的头部留了32bits来放引用计数,
    所以字符串的起始地址和字符串第1个字符的地址不一样。
      

  3.   


    但是存储的空间因该是连续的,但我发现pointer(hh)^ 和@(hh[1])
    的地址相差太远,根本不是32bits。
      

  4.   

    楼上的,hh是一个字符串变量,pointer(hh)的意思是存储该字符串地址的指针,
    pointer(hh)^表示的是字符串变量地址里的内容,就是第一个字符的存储地址。
    你明白了吗??????
      

  5.   

    String 第0到-3時它的長度,第-4到-7是它的長度!它的數據物理地址在@S[1]開始
      

  6.   

    你自己去比较一下pointer(hh) 和 @(hh[1])的值就知道了
    是不是pointer(hh)=@(hh[1]),
    pointer(hh)才是第一个字符的物理地址!!!! 若hh := '1234';
    pointer(hh)^ 就为 $34333231;
    pointer(hh)^表示的就是第一个字符的物理地址纯粹是天方夜谭
      

  7.   

    var hh : String;
      hh := 'efwefwefw';
    1、pointer(hh)相当于: PChar(hh)。只不过pointer(hh)没有指定类型而已。你可以用下列代码测试:
      if pointer(hh) = PChar(hh) then ShowMessage('相等');
    也就是说pointer(hh)是指向'e'的。
    pointer(hh)^这样的用法实际上是不对的,^应该操作在有类型而不是无类型指针上,否则无法正确操作,因为^操作符对于不同类型的指针而言含义有所不同。也就是说它在理论上相当于PChar(hh)^,结果为‘e’。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ——————————————————————————————————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  8.   

    @(hh[1])看似是指向字符串第一个字符的指针,实际上是错误的想法。hh[1]生成了一个临时字符变量,而@(hh[1])就是取得这个临时变量的地址!跟hh已经毫无关系了!相当于:
    var
      C: Char;
    begin
      C := hh[1];
      你现在能说@C是指向hh第一个字符的指针么?
    end;—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  9.   

    我觉得@(hh[1])是指向字符串第一个字符的指针,没有错p:pchar;
    p:=@(hh[1]);//相当于pchar(hh);
      

  10.   

    也可以说@(hh[1])是hh所指向字符串'efwefwefw'的地址
    看汇编,就会明白一切
      

  11.   

    zjqyb() ( ▲▲▲▲▲) :
    你是对的,我对于@(hh[1])的问题说错了。
    @(hh[1])  = pointer(hh) = PChar(hh)。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————