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)^) 做地址加减。
这个语言着色有问题!