Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 2428|回复: 5

请教:Delphi代码中@和^是什么意思

[复制链接]

该用户从未签到

发表于 2012-6-17 20:16:24 | 显示全部楼层 |阅读模式
有的在数组前加"@",有的不加;^多加在类型前.不知有什么用处.
请大家指教.谢谢
回复

使用道具 举报

该用户从未签到

发表于 2012-6-18 07:36:33 | 显示全部楼层
@,代表地址
^,指针
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-6-18 07:48:26 | 显示全部楼层
指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。指针的指针就是用来存放指针所在的内存地址的。

@:取址运算符;
^:指针的引用解析操作符;

//////////////////

1,类型指针的定义。对于指向特定类型的指针
var
ptr : ^Integer;
ptr : ^char;
2,无类型指针的定义。也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型:Pointer。
ptr : Pointer;

3,指针的解除引用。要解除指针引用(即取出指针所指区域的值), ptr^。

4,取地址(指针赋值)。取某对象的地址并将其赋值给指针变量,ptr := @Object;

以下内容参考 delphi的帮助:

看一个指针用法的例子:  
   1          var  
   2              X,    Y:    Integer;        //    X    and    Y    整数类型  
   3              P:    ^Integer;            //    P    指向整数类型的指针  
   4          begin  
   5              X    :=17; //    给    X    赋值  
   6              P    :=    @X;                    //    把    x的地址赋给p  
   7              Y    :=    P^;                    //    取出p所指向的数值赋给y  
   8          end;  
   
   第二行定义了两个变量X,y.    第三行声明了p是指向整数类型的指针;意味着p能够指向x或者y的地址.第五行赋给x值,第六行把x的地址赋给p.最  
   
   后通过p指向的变量赋值给y.此时,x和y有相同的值.  
   
   操作符@用来取出变量的地址,也可以取出过程和函数的地址.  
   
   而符号^有两个目标,  
   当它出现在类型定义的前面时如 ^typename 表示指向这种类型的指针;  
   当它出现在指针变量后边时    如 point^ 返回指针指向的变量的值;  
   
   理解指针比较容易理解面向对象的pascal语言,因为指针经常在幕后操作.任何要求动态分配大的内存空间的类型可以用指针类型.例如  
   
   ,long-string变量,实际在使用指针进行操作.另外一些高级的编程技术需要使用指针类型.  
   有时指针是适应object    pascal严格的类型限制的唯一方法.同过一个通用的指针类型,通过类型转换成不同的指针类型,如下面的例子:  
   type  
   
       PInteger    =    ^Integer;  
   var  
       R:    Single;  
       I:    Integer;  
       P:    Pointer; //通用的指针  
       PI:    PInteger;  
   begin  
       P    :=    @R; //取出R的内存地址  
       PI    :=    PInteger(P); //把通用类型转换成指向整数类型的指针  
       I    :=    PI^;  
   end;  
   
   当然了,实数和整数的存储格式不同.这种赋值是把原始的二进制数据从R拷贝到I,而不进行转换.  
   
   保留字nil是一个特殊的常量可以赋给任何指针类型,当nil赋給一个指针时,指针什么也不指向,是一个空指针.  
   
   @操作符返回变量的内存中的存储地址,或者是过程\\函数\\方法;  
   
   1.如果变量,@X返回的是x的地址。如果编译选项{$T-}没有打开,着返回的事一个通用的指针,如果编译选项打开了,着返回的是x的类型对应的指  
   
   针.  
   
   2.如果是例程(过程\\函数),@F返回的是F的入口点,@F的类型是一个指针。  
   
   3.当@用在类的方法中时,则方法的名称必须有类名,例如@TMyclass.Dosomething  
   指针指向TMyclass的dosomething方法。  
   
   
   当一个过程变量在赋值语句的左边时,编译器期望一个过程值在赋值语句的右边。这种赋值使得左边的变量可以指向右边定义的过程或者函数  
   
   入口点。换句话说,可以通过该变量来引用声明的过程或者函数,可以直接使用参数的引用。  
   
   var  
   
       F:    function(X:    Integer):    Integer;  
       I:    Integer;  
   function    SomeFunction(X:    Integer):    Integer;  
     ...  
   F    :=    SomeFunction;      //    给f赋值  
   I    :=    F(4);                      //    调用所指向的函数  
   
   在赋值语句中,左边变量的类型决定了右边的过程或者方法指针解释。  
   
   var  
   
       F,    G:    function:    Integer;  
       I:    Integer;  
   function    SomeFunction:    Integer;  
     ...  
   F    :=    SomeFunction;      //    给f赋值  
   G    :=    F;                            //    把F的值拷贝给G  
   I    :=    G;                            //    调用函数  
   
   第一句获得函数的入口,第二句将指针复制,第三句获得函数的返回值。  
   
   有时候还可以这样使用  
   if    F    =    MyFunction    then    ...;  
   在这里,F的出现导致一个函数调用;编译器调用F指向的函数,然后调用Myfunction,比较结果。这个规则是无论何时一个过程变量(  
   
   procedural    variable)出现在一个表达式中,它表示调用所指向的函数或者过程。有时F指向一个过程(没有返回值),或者f指向一个需要参  
   
   数的函数,则前面的语句会产生一个编译错误。要比较F和Myfunction需要用  
   if    @F    =    @MyFunction    then    ...;  
   @F把F转换成一个包含地址的无类型的指针变量,@myfunction返回myfunction的地址。  
   获得一个过程变量的内存地址使用@@。例如,@@F返回F的地址。  
   
   @操作符通常把一个无类型的指针值赋给一个过程变量,例如:  
   var    StrComp:    function(Str1,    Str2:    PChar):    Integer;  
     ...  
   @StrComp    :=    GetProcAddress(KernelHandle,    'lstrcmpi');  
   调用GetProcAddres函数,用strcomp指向这个值  
   任何过程变量可以赋成nil,表示指证什么也不指向。但是试图调用一个nil值的过程变量导致一个错误,为了测试一个过程变量是否可以赋值  
   
   ,用标准的赋值函数Assigned  
   if    Assigned(OnClick)    then    OnClick(X);  


总结:
^: 指针
@: 取址
#: 十进制符
$: 十六进制符
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-6-18 12:51:12 | 显示全部楼层
非常感谢,我先消化一下.
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-6-21 13:58:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2012-8-26 13:33:07 | 显示全部楼层

回 2楼(红鱼儿) 的帖子

红鱼儿:指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。指针的指针就是用来存放指针所在的内存地址的。

@:取址运算符;
^:指针的引用解析操作符;

....... (2012-06-18 07:48) 
写得真不错。
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-3 10:59 , Processed in 0.029917 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表