SetLength动态分配的字符串的索引是从0开始的还是从1开始的?(70分)

  • 主题发起人 主题发起人 c1
  • 开始时间 开始时间
C

c1

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi关于动态数组的文档中说:
Dynamic arrays are always integer-indexed, always starting from 0.
但是,字符串好像通常是从1开始的。

我都给搞糊涂了。
 
先看看AnsiString的定义:
type Ansistring = packed record
  allocSiz: Longint
//动态分配大小
  refCnt: Longint
//引用计数
  length: Longint
//实际长度
  ChrArr:array[1..allocsiz-6]of char
//字节序列
end

其中Astring[1]将返回Astring.ChrArr[1]的内容。
 
字符串是从1开始,但是0中存储的字符串的长度!
 
刚今天看了书上说的,从0开始,不过错了是书上的问题,不要怪到我头上哦:)
 
//字符串是从1开始,但是0中存储的字符串的长度!
那是Pascal中的String,也即Delphi的ShortString
只要编译器中的 HugeString 打开,则定义String
均为长字符串。

而动态数组则通常是从 0 开始的!!
 
同意 :吴向球,

"字符串是从1开始,但是0中存储的字符串的长度!"

 
//只要编译器中的 HugeString 打开,则定义String均为长字符串。
还是从 1 开始^_^ 不过 0 不是储存大小的(实际上是存在负偏移处)
 
只要你的变量声明为 string、ShortString、AnsiString 或 WideString 则从 1 开始。
 
0:start,1:content start
 
delphi中的字符串大都是从1开始的,只不过shortstring( 用string定义时要求$H+关着)
的第0个里存的是长度,而widestring(长字符串)和AnsiString中的第0个不是长度。
 
同意吴向球:
字符串是从1开始,但是0中存储的字符串的长度!
动态数组则通常是从 0 开始的!
 
SetLength(MyAray,2)
//2指长度
MyArray[0]:= //数组下界从0开始
MyArray[1]:= //上界Length-1
MyArray:=nil
//使用完毕注意释放
 
数组下界从0开始
 
用setlength函数是从0开始的
一般用setlength函数的是一些动态的变量
象widestring,Ansistring,PChar等字符串类型
你可以参考《开发人员指南》那里有详细的关于字符串的说明[8D]
 
to c1:
SetLength可以设置 动态数组 和 字符串 的长度
这里说的从0开始指的是动态数组,字符串从什么开始开始那是另外一码事
(虽然字符串和动态数组存储差不多,但是你高级用户来说,把他们分开2种类型
讨论还是比较好的,不要去深究他的内部数据结构了,简单的理解就是,从0开始是说
动态数组的,和string无关)
 
后退
顶部