delphi 指针 入门

delphi 指针 入门
2009年03月13日 星期五 12:36

指针,是一个无符号整数(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);   


内容概要:本文围绕列车-轨道-桥梁交互仿真研究,基于Matlab平台构建数值模型,系统分析列车运行过程中轨道与桥梁结构间的动态相互作用机制。研究涵盖多体动力学建模、耦合系统运动方程求解、边界条件设定及仿真结果可视化等关键环节,重点揭示高速行车条件下基础设施的振动传递规律与力学响应特征。该仿真方法可有效评估结构安全性、舒适性指标及疲劳寿命,为轨道交通工程的设计优化与运维管理提供理论支撑和技术路径。文中配套提供了完整的Matlab代码实现方案及操作说明,便于用户复现、验证和拓展相关研究。; 适合人群:具备Matlab编程基础和结构动力学、车辆动力学等相关专业知识的研究生、科研人员及从事铁路工程、桥梁工程与交通系统安全评估的工程技术人才,尤其适合开展轨道交通耦合振动课题的研究者。; 使用场景及目标:①用于高校与科研机构进行列车-轨道-桥梁耦合系统动力学特性的教学演示与科学研究;②支撑高速铁路桥梁的设计优化、运营安全性评估与减振降噪方案验证;③为复杂交通基础设施的多物理场耦合仿真提供建模思路与代码参考。; 阅读建议:建议读者结合所提供的Matlab代码逐模块深入研读,重点关注系统建模假设、质量-刚度-阻尼矩阵构建方法及数值积分算法的实现细节,同时可通过调整参数进行敏感性分析,进一步掌握仿真模型的适用范围与优化方向。
内容概要:本文系统研究了非线性薛定谔方程的物理信息神经网络(PINN)求解方法,提出一种将物理规律嵌入深度学习模型的科学计算新范式。通过构建全连接神经网络架构,将非线性薛定谔方程及其初始/边界条件作为损失函数的核心组成部分,实现了在无须大量标注数据的前提下对复值偏微分方程的高精度数值求解。该方法充分利用自动微分技术精确计算方程残差,有效融合了数据驱动与模型驱动的优势,在光学孤子传播、量子系统演化等典型场景中展现出优异的逼近能力与泛化性能。文中配套提供了完整的Python实现代码,涵盖网络搭建、损失定义、训练优化与结果可视化全流程。; 适合人群:具备Python编程能力与深度学习基础知识,熟悉偏微分方程理论及科学计算的理工科研究生、科研人员,以及从事光学、量子物理、流体力学等领域建模与仿真的工程技术人员。; 使用场景及目标:① 掌握PINN方法的基本原理与实现技巧;② 学习如何将复杂物理方程转化为可训练的神经网络损失项;③ 应用于非线性光学、玻色-爱因斯坦凝聚、水波动力学等问题的仿真与预测;④ 为相关科研课题提供可复现的算法原型与代码参考。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解神经网络对微分算子的近似机制、损失函数的多任务加权策略以及训练过程中的超参数调优方法,进而可迁移至其他非线性偏微分方程的求解任务,拓展其在交叉学科中的应用边界。
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 微软推出的【AZ-900微软认证】是一项针对初学者的基础级云服务资格认证,其目的在于帮助学习者掌握云概念、微软Azure服务的运作机制以及云解决方案的核心知识。获得这一认证后,考生将能够清晰地理解云计算领域的基础术语、服务模式(包括IaaS、PaaS、SaaS等)以及这些服务在Azure平台上的实际应用方式。 在【必过考题】部分,我们可以观察到两个重点议题,它们分别聚焦于PaaS(平台即服务)的概念阐释和云成本的计算方式。 在第一个议题中,考生被要求辨别关于PaaS的正确性描述。PaaS平台提供了一个开发环境,但并不允许用户直接访问操作系统(Box 1: No)。比如,Azure Web Apps服务可以用来部署web应用,但用户无法直接管理虚拟机或IIS系统。另一方面,PaaS确实具备自动扩展的功能(Box 2: Yes),这表示可以根据实际需求自动增加负载均衡的虚拟机以支持web应用的运行。PaaS框架还为开发人员提供了构建和调整云端应用的工具,预置的应用组件能够有效缩短新应用的编程周期(Box 3: Yes)。 第二个议题同样关注云计算理念的理解,尤其强调IT支出从资本性支出(CapEx)向运营性支出(OpEx)的转型思想。传统的IT投资通常被视为CapEx,而云计算的按需付费机制使企业能够将这部分开支转化为OpEx,从而在财务规划上获得更大的自由度。 在为AZ-900考试做准备时,考生需要特别关注以下几个核心知识点: 1. **云服务模式**:深入理解IaaS(基础设施即服务)、PaaS和SaaS(软件即服务)之间的差异及其各自的应用情境。 2. **Azure服务*...
源码下载地址: https://pan.quark.cn/s/239a0d536a1e 依据所提供的文件资料,可以归纳出以下核心内容:由清华大学计算机系邓俊辉教授精心编纂的算法训练营题目合集,对于CSP(中国软件专业人才设计与创业大赛)及PAT(程序设计能力测试)这类编程竞赛具有极高的参考价值,堪称一份极具价值的参考资料。此类竞赛普遍对参赛者的算法功底和编程技巧提出严苛要求。该合集中的题目与算法领域紧密相连,其中包含了“最大红矩形”这一典型题目。所谓最大红矩形题目,其核心任务是针对一个由红色与绿色方格构成的棋盘,寻觅出最大的纯红矩形区域。要攻克这一问题,必须运用数据结构与算法的相关知识,特别是栈这一数据结构的应用。 “最大红矩形”问题能够被抽象转化为“直方图最大面积”问题。具体转化方法是将棋盘的每一列视为一个独立的直方图单元,其中红色方格的贡献体现为当前位置与前一个绿色方格所在行数的差值,从而保证每个直方图的基宽恒定为1。随后,借助扫描直方图的技术手段来探寻最大矩形面积。这一过程需要对每个直方图进行系统性遍历,并利用栈来记录各直方图的下标信息。一旦检测到当前直方图的高度小于栈顶元素所记录的高度,则意味着遭遇了一个“高点”,此时需计算以该“高点”为右边界条件的最大矩形面积。 在编程实践环节,必须高度关注栈的操作细节,以及如何精确地初始化和操纵栈来应对直方图问题。代码实现中,通常配置两个栈,一个用于储存直方图的高度值,另一个用于标记直方图的下标位置。当面对新高度时,需审慎判断当前高度与栈顶高度的相对关系,并据此抉择是执行入栈操作还是计算面积。针对“低点”(即当前高度小于栈顶),应直接将当前高度纳入栈中;而对于“高点”,则需执行弹出栈顶元素的操作,并基于该栈顶元素的高...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值