Lazarus 指针,数组,字符串
type tsArr=array [0..2] of char; tbArr=array [0..2] of byte; procedure TForm1.abc; const str:ansiString='abcde'; var s1:array [0..2] of char; s2:string[3]; s3:string; s4:array of char; bArr:array [0..2] of byte; p:pointer; pC:PChar; begin Memo1.Append('指针,数组,Memo新特性'); Memo1.Append(Format('s1 的长度: %d ',[Length(s1)])); Memo1.Append(Format('s2 的长度: %d ',[Length(s2)])); Memo1.Append(Format('s3 的长度: %d ',[Length(s3)])); Memo1.Append(Format('s4 的长度: %d ',[Length(s4)])); Memo1.Append(Format('bArr 的长度: %d ',[Length(bArr)])); //{ 输出结果 //s1 的长度: 3 //s2 的长度: 0 //没有数据时长度为0 //s3 的长度: 0 //没有分配长度为0 //s4 的长度: 0 //bArr 的长度: 3 //} s1:=str; s2:=s1; // s2:=str; string[] 与 array [] of char 是赋值相容的 Memo1.Append(Format('s1 地址 %x 引用地址:%x %s,%s,%s', [Integer(@s1),Integer(@s1[0]) ,s1,(s1)[0],s1[0]]) ); // s1 地址 214F440 引用地址:214F440 abc,a,a // s1^ , s1^[0] 是错误的表示方法; Memo1.Append(Format('s2 地址 %x 引用地址:%x %s,%s,%s', [Integer(@s2),Integer(@s2[1]) ,s2,(s2)[1],s2[1]]) ); //s2 地址 214F43C 引用地址:214F43D abc,a,a //存储空间是连续的,序号从 1 开始 s3:=s1; Memo1.Append(Format('s3 地址 %x 引用地址:%x %s,%s,%s', [Integer(@s3),Integer(@s3[1]) ,s3,(s3)[1],s3[1]]) ); //s3 地址 214F438 引用地址:66050 abc,a,a //变量与引用在不同的地址空间,地址不连续。 引用序号从 1 开始 s4:=s1; //与String 赋值不相容,与 array [] of char 赋值相容; Memo1.Append(Format('s4 地址 %x 引用地址:%x %s,%s,%s', [Integer(@s4),Integer(@s4[0]) ,PChar(s4),(s4)[0],s4[0]]) ); //s4 地址 214F434 引用1地址:66060 ab,a,a 但长度发生变化了 //变量与引用在不同的地址空间,地址不连续。 引用序号从 0 开始 //输出强制 string(s4) 结果为 ab ; Pchar(s4) 结果为 abc ; 这一点很奇怪 bArr:=tbArr(s1); //与String 赋值不相容,与 array [] of char 赋值相容; Memo1.Append(Format('bArr 地址 %x 引用地址:%x %s,%s,%s', [Integer(@bArr),Integer(@bArr[0]) ,tsArr(bArr),char((bArr)[0]),char(bArr[0])] ) ); //bArr 地址 214F430 引用地址:214F430 abc,a,a //变量与引用在同一的地址空间 pC:=PChar(s3); //赋值相容 与 pC:=@s1 有相同的效果 ; Memo1.Append(Format('pC 地址 %x 引用地址:%x %s,%s,%s', [Integer(@pC),Integer(pC) ,pC,(pC)[0],pC[0]]) ); //pC 地址 214F428 引用地址:214F440 abc,a,a //变量与引用在不同的地址空间,操作同string p:=pointer(s4); //p:=@s1; p:=pointer(@s1); p:=@s1[0]; p:=pointer(s3); //这些都可以,但shortString 就不要和指针打搅了 Memo1.Append(Format('p 地址 %x 引用地址:%x %s,%s,%s', [Integer(@p),Integer(p) ,pchar(p),char((p+1)^),char(p^)]) ); //p 地址 214F42C 引用地址:214F440 abc,b,a //变量与引用在不同的地址空间,操作同C或C++,但操作过程有很多地方用到强制 //Delphi 中部不可以 char((p+1)^) 做地址加减。
这个语言着色有问题!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库