您好,为何S[0]不能访问 ?(20分)

  • 主题发起人 主题发起人 驿路的梦
  • 开始时间 开始时间
驿

驿路的梦

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,
var s : String ;
S := '1234' ;
//S[0]应该为其长度 4 ,但为何 S[0] 取不出来 ?
提示 [Error] Unit1.pas(37): Element 0 inaccessible - use 'Length' or 'SetLength'
s[0] 不可读

这位字符应该怎样取出 ? 只有通过 Length() ? 难道直接访问不行 ?

谢谢
 
String是从1开始的,这跟C的数组不同
 
对于长字符串,不能访问索引为0的元素,因为他根本就不存在
只能通过Length
 
但从存储结构上看,系统为 String 分配了一个保存其长度的字节 S[0] ,既然分配了,为何
不能访问到 ?
 
你从哪儿看的存储结构?

实际上长字符串的长度为一个整数,4个8位字节
而S[0]是一个字符,表示的范围0-255,显然不够用,
所以对长字符串来说S[0]是没有任何意义的
 
谢谢
这样的:
---------------------------------------------------------------------
string类型在指示器{H+}的时候为AnsiString,{H-}的时候为ShortString
AnsiString为生存期自管理类型,其结构为:|分配的大小|引用计数|长度|DDG|#0|
AnsiString类型变量实际是指向DDG字符串数据区的指针,可通过下标访问其字符元素,
但不能通过S[0]来访问其长度。 ////
ShortString是为了保持和Delphi 1的兼容所保留的,其结构为:|长度|DDG|
可以通过S[0]来访问其字符串长度。 ////
--------------------------------------------------------------------------
对上面 //// 处 我不明白,为何 ShortString 可以通过 S[0]得到其长度 而 AnsiString 就不可以?

请指导,谢谢

 
字符不能用s[0]表示,s[1]才是表示顯示字符串的第一個字符
 
s[0] 处不是字符,应该是其长度 ,我想知道{H+}时为何不能得到它 ?

谢谢
 
因为两种字符串的实现完全不同,存储结构不同,
这是系统约定,如果想改变,那是不可能的
var
S1: String; //此处为长字符串,S1[0]没有意义
S2: String[200]; //此处为短字符串,S2[0]表示字符串的实际长度
 
系统约定 ?
 
var
s,s2:string;
i:integer;
pp:pchar;
begin
i:=0;
s:='1234d';
pp:=pchar(s);
pp:=pp-1;
pp:=pp-1;
pp:=pp-1;
pp:=pp-1;
//showmessage(pp);
s2:=pp;
showmessage(inttostr(ord(s2[1])));
end;
 
楼上您好,没有看懂:),您能讲讲么 ?
1 .
s:='1234d';
pp:=pchar(s);
如果 : s 存储结构为 : 分配的大小|引用计数|长度|DDG|#0|
8 ? 0 5 1234d #0
PP := Pchar(s) ; //此时 ,PP 具体指向上面结构哪一位 ?
2. Ord() 函数什么含义 ?
ShowMessage(s2[1]) ; //为空
showmessage(inttostr(ord(s2[1]))); // 5

谢谢
 
1. pp指向数据区的第一个字符
2. Ord是一个系统(对于Pascal来说)函数,是要取一个有序类型的序数
有序类型是一种基础类型,整数,枚举,布尔类型都是有序类型
 
to hfghfghfg
pp也就是pchar类型的变量自我减一是什么意思,有什么意义?
pp:=pp-1;
 
pp:=pp-1; //地址 -1 ,地址运算

不过我还是没有弄懂:

1 .
s:='1234d';
pp:=pchar(s);
如果 : s 存储结构为 : 分配的大小|引用计数|长度|DDG|#0|
8 ? 0 5 1234d #0
PP := Pchar(s) ; //此时 ,PP 具体指向上面结构哪一位 ?

“1. pp指向数据区的第一个字符” ,那么 (PP - 4) 指向哪儿 ?

2. Ord() 函数什么含义 ?
ShowMessage(s2[1]) ; //为空
showmessage(inttostr(ord(s2[1]))); // 5

s2[1] 相对什么 讲有序 ?

谢谢
 
1.当然是字符串长度部分的第一个字节了,
2.字符类型也是有序类型呀,S2[1]是字符类型

有序类型是指和整数有对应关系的数据类型,当然浮点数就不是有序类型
 
string被delphi默认为AnsiString型了
所以和你看的那段话并不茅盾
 
ok ,让我验证一下 :)

谢谢
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
650
import
I
后退
顶部