1,
var
  S:string;
begin
  S:='aaa';
end;问:S在栈中是怎么存放的,如变量名S怎么放,指向堆中'aaa'内存块的指针地址又是怎么存放? S与'aaa'的指针地址是怎么关联的?2,string,Pchar,Pbyte,array of char与^array of char有什么区别,怎么互相转换?

解决方案 »

  1.   

    给你这个万一博客的,很清晰,http://www.cnblogs.com/del/archive/2008/03/03/1088984.html
      

  2.   

    楼主干什么,要搞编译器吗?回答你第2个问题
    string,Pchar,Pbyte,array of char与^array of char有什么区别,怎么互相转换?string 字符串类型
    PChar 字符串指针类型
    PByte 字节指针类型
    array of char 字符数组
    ^array of char字符数组指针
      

  3.   

    谢谢楼上两位.请问,短字符串第一个字节string[0]是字符串大小,存储为什么形式的?
    str:string[3];str:='aaa';
    ShoWMessage(str[0]);怎么显示的是其他符号而不是长度呢?
      

  4.   


    改成 ShoWMessage(IntToStr(ord(str[0])));  就是显示长度了
      

  5.   

    字符串在栈中为4字节,存放的是字符串在堆中的地址。字符串的实际内容存在堆中。
    格式为: 32位引用计数+32长度+字符串的值
    得到字符串的长度:
    len:=pinteger(integer(str)-4)^;
    ref:=pinteger(integer(str)-8)^;
      

  6.   


    'aaa'不在堆中,而是在静态数据区,这个地方既不是堆,也不是栈。字符串的幕后管理非常复杂,你一下子搞不懂。慢慢来吧
      

  7.   

    string 字符串类型 
    PChar 字符串指针类型 
    PByte 字节指针类型 
    array of char 字符数组 
    ^array of char字符数组指针 
    只知道这些了。
      

  8.   

    'aaa'不在堆栈中,而是在静态数据区.
    string 字符串类型 
    PChar 字符串指针类型 
    PByte 字节指针类型 
    array of char 字符数组 
    ^array of char字符数组指针 
      

  9.   

    我在7楼说“一下子搞不懂”,似乎有点不负责任。
    本想把自己对字符串的一些认识系统地写一篇文章,但无奈时间不足。
    找了以前回过的一些贴子,楼主可以参考一下:http://topic.csdn.net/u/20080413/17/a91d878d-9a9f-436c-97a7-75be2dc0e34b.html
    着重看这贴的20楼有一个例子
    http://topic.csdn.net/u/20080414/10/f518df18-d7be-40c9-80a7-6c2142c8dec6.html
    http://topic.csdn.net/u/20080412/22/863b4b21-296d-43cf-96ef-8ff24cb425ce.htmlhttp://rabbitfox.blog.sohu.com/38253374.html里面所说不一定完全正确。关于长字符串(动态字符串)string,我所说的“一下子搞不懂”,是指,它使用了“Copy On Write”技术,在@Str[1]负偏移数个字节处,分别存放着长度、引用计数等信息,这需要楼主根据我提出的关键词找资料学习一下。