请看以下代码:
program Project2;{$APPTYPE CONSOLE}uses
  SysUtils;
var
  GVar1:Integer;
  GVar2:Integer;function GetAddr(Const aVar):String;
begin
  Result := IntToHex(Integer(@aVar),8);
end;function GetDataAddr(Const aVar):String;
begin
  Result := IntToHex(Integer(aVar),8);
end;procedure WriteLocalVar2;
var
  StackVar:String;
begin
  StackVar := '0123456789';
  Writeln('Stack Var :',GetAddr(StackVar),'Length:':15,SizeOf(StackVar));
  Writeln('Variable Str:',GetDataAddr(StackVar),'Length:':15,Length(StackVar));
end;begin
  { TODO -oUser -cConsole Main : Insert code here }
  WriteLocalVar;
  readln;
end.问题:
1.@aVar与Integer(aVar)有什么区别?
2.当变量转换为Const时,它还是原来的类型吗?如上代码中String 变为 Const String吗?
3.当我单步进入function GetAddr(Const aVar):String;时,为什么aVar为没有值,String(aVar)为一大堆乱码,究竟怎样才能正确显示aVar的值?

解决方案 »

  1.   

    1.aVar取的是aVar的内容,@aVar则取其在内存当中的地址值
    2.这个问题在程序上面没有体现出来,不过const string和string在参数当中是一样的,只不过使用const声明之后不允许改变其内容。
    3.aVar没有值,但是aVar的地址是存在的。不过很抱歉,没在上面程序段当中找到string(aVar),所以有点不明白楼主实际的意思。
      

  2.   

    1.@aVar与Integer(aVar)有什么区别?
      @aVar 是取aVar的内存地址.Integer(aVar)是将aVar转换成Integer,因为形参是无型类型.2.当变量转换为Const时,它还是原来的类型吗?如上代码中String 变为 Const String吗?
      如果是引用传递应该不是原来的类型.不如不是就是原来的类型.上面代码不会..3.当我单步进入function GetAddr(Const aVar):String;时,为什么aVar为没有值,String(aVar)为一大堆乱码,究竟怎样才能正确显示aVar的值?
      不明白.....
      

  3.   

    3.当我单步进入function GetAddr(Const aVar):String;时,为什么aVar为没有值,String(aVar)为一大堆乱码,究竟怎样才能正确显示aVar的值?
    avar为什么会没有指定类型呢?
      

  4.   

    function GetAddr(Const aVar):String;
    begin
      Result := IntToHex(Integer(@aVar),8);
    end;
    这个函数应该是返回了aVar在你机器上的实际地址,并转换为16进制
      

  5.   

    这是问题并不菜哦题外话:
    const常量默认是不能改变值的,所以是“常量”,除非使用了{$J+}编译指令
      

  6.   

    问题1还没有说得清楚,但本人已明白:首先,StackVar是字符串,它的内容存放在堆分配的空间上,而它的值是堆上的地址,指明内容的位置,是一个32位的地址值,所以@aVar是指 StackVar的值 在堆上的地址,aVar是 StackVar的内容 的地址而问题2和3可以合起来一起讨论:function GetAddr(Const aVar):String;没有语法上的错误,aVar可以接受任何类型的数,只是在单步调试时,要观察aVar的内容,必须在Watch的表达式上进行 类型转换,如Integer(aVar),但如果是String(aVar)就不能正确显示请问怎样才可以显示aVar的内容,(另:评价一下Delphi的调试器,本人觉得VC的好用多了,功能强多了,请问Delphi的调试器和VC的一样强大吗?有没有第三方的调试器?)