var
m, n: Integer;
s: String; //OP中的字串类型和普通简单类型不同,在内存的存在方式类似于对象引用模型,实际的字串内容放在堆上,而引用指针放在栈上,至于引用计数是否存在要看字串类型了(堆上字串内容也要依类型而定)。执行到这里的时候仅仅是在栈上开辟了一个4字节的指针空间,但内容是无意义的
begin
s := 'abc'; //字串使用的是Copy-On-Write技术。这个时候才在堆上分配内存并将实际内容放进去,同时将栈上无意义的字串指针的内容设置为堆上物理字串的首地址
//在进行其他关于s的操作的时候会对引用计数进行不断的改变(要看字串类型),同时也可能会派生其他的物理字串(在堆上)
m := Integer(@s); //这里是利用方法一进行去地址操作,取的是字串中指针部分在栈上的地址,也可以使用函数Addr代替操作符@
n := Integer(Pointer(s)); //由于字串变量本身就是一个栈上的指针,所以里面的内容实际上存放的就是实际物理字串在堆空间中的首地址----一个指针,所以这里仅仅是进行安全的强制类型转换----这里也是取地址的一种方式,直接对指针变量内容(一个指针)进行类型转换后取得
end;